Home | History | Annotate | Download | only in DRIVER
      1 #include "test/vts/specification/lib/ndk/bionic/1.0/libcV1.vts.h"
      2 #include <unistd.h>
      3 #include <stdint.h>
      4 #include <sys/types.h>
      5 #include <linux/socket.h>
      6 #include "vts_datatype.h"
      7 #include "vts_measurement.h"
      8 #include <android-base/logging.h>
      9 
     10 
     11 namespace android {
     12 namespace vts {
     13 bool FuzzerExtended_libc::Fuzz(
     14     FunctionSpecificationMessage* func_msg,
     15     void** result, const string& callback_socket_name) {
     16     const char* func_name = func_msg->name().c_str();
     17     LOG(INFO) << "Function: " << func_name;
     18     if (!strcmp(func_name, "socket")) {
     19         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     20     LOG(INFO) << "arg0 = " << arg0;
     21         int32_t arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_int32_t()) ? func_msg->arg(1).scalar_value().int32_t() : RandomInt32();
     22     LOG(INFO) << "arg1 = " << arg1;
     23         int32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_int32_t()) ? func_msg->arg(2).scalar_value().int32_t() : RandomInt32();
     24     LOG(INFO) << "arg2 = " << arg2;
     25         typedef void* (*func_type_socket)(...);
     26     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_socket) target_loader_.GetLoaderFunction("socket"))(
     27           arg0,
     28           arg1,
     29           arg2)));
     30         return true;
     31       }
     32     if (!strcmp(func_name, "accept")) {
     33         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     34     LOG(INFO) << "arg0 = " << arg0;
     35         struct sockaddr* arg1 = (struct sockaddr*) malloc(sizeof(struct sockaddr));
     36     LOG(INFO) << "arg1 = " << arg1;
     37         socklen_t* arg2 = (socklen_t*) malloc(sizeof(socklen_t));
     38     LOG(INFO) << "arg2 = " << arg2;
     39         typedef void* (*func_type_accept)(...);
     40     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_accept) target_loader_.GetLoaderFunction("accept"))(
     41           arg0,
     42           arg1,
     43           arg2)));
     44         return true;
     45       }
     46     if (!strcmp(func_name, "bind")) {
     47         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     48     LOG(INFO) << "arg0 = " << arg0;
     49         struct sockaddr* arg1 = (struct sockaddr*) malloc(sizeof(struct sockaddr));
     50     LOG(INFO) << "arg1 = " << arg1;
     51         socklen_t* arg2 = (socklen_t*) malloc(sizeof(socklen_t));
     52     LOG(INFO) << "arg2 = " << arg2;
     53         typedef void* (*func_type_bind)(...);
     54     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_bind) target_loader_.GetLoaderFunction("bind"))(
     55           arg0,
     56           arg1,
     57           arg2)));
     58         return true;
     59       }
     60     if (!strcmp(func_name, "connect")) {
     61         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     62     LOG(INFO) << "arg0 = " << arg0;
     63         struct sockaddr* arg1 = (struct sockaddr*) malloc(sizeof(struct sockaddr));
     64     LOG(INFO) << "arg1 = " << arg1;
     65         socklen_t* arg2 = (socklen_t*) malloc(sizeof(socklen_t));
     66     LOG(INFO) << "arg2 = " << arg2;
     67         typedef void* (*func_type_connect)(...);
     68     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_connect) target_loader_.GetLoaderFunction("connect"))(
     69           arg0,
     70           arg1,
     71           arg2)));
     72         return true;
     73       }
     74     if (!strcmp(func_name, "listen")) {
     75         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     76     LOG(INFO) << "arg0 = " << arg0;
     77         int32_t arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_int32_t()) ? func_msg->arg(1).scalar_value().int32_t() : RandomInt32();
     78     LOG(INFO) << "arg1 = " << arg1;
     79         typedef void* (*func_type_listen)(...);
     80     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_listen) target_loader_.GetLoaderFunction("listen"))(
     81           arg0,
     82           arg1)));
     83         return true;
     84       }
     85     if (!strcmp(func_name, "recv")) {
     86         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
     87     LOG(INFO) << "arg0 = " << arg0;
     88         void* arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_void_pointer()) ? reinterpret_cast<void*>(func_msg->arg(1).scalar_value().void_pointer()) : RandomVoidPointer();
     89     LOG(INFO) << "arg1 = " << arg1;
     90         uint32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_uint32_t()) ? func_msg->arg(2).scalar_value().uint32_t() : RandomUint32();
     91     LOG(INFO) << "arg2 = " << arg2;
     92         int32_t arg3 = (func_msg->arg(3).type() == TYPE_SCALAR && func_msg->arg(3).scalar_value().has_int32_t()) ? func_msg->arg(3).scalar_value().int32_t() : RandomInt32();
     93     LOG(INFO) << "arg3 = " << arg3;
     94         typedef void* (*func_type_recv)(...);
     95     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_recv) target_loader_.GetLoaderFunction("recv"))(
     96           arg0,
     97           arg1,
     98           arg2,
     99           arg3)));
    100         return true;
    101       }
    102     if (!strcmp(func_name, "send")) {
    103         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
    104     LOG(INFO) << "arg0 = " << arg0;
    105         void* arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_void_pointer()) ? reinterpret_cast<void*>(func_msg->arg(1).scalar_value().void_pointer()) : RandomVoidPointer();
    106     LOG(INFO) << "arg1 = " << arg1;
    107         uint32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_uint32_t()) ? func_msg->arg(2).scalar_value().uint32_t() : RandomUint32();
    108     LOG(INFO) << "arg2 = " << arg2;
    109         int32_t arg3 = (func_msg->arg(3).type() == TYPE_SCALAR && func_msg->arg(3).scalar_value().has_int32_t()) ? func_msg->arg(3).scalar_value().int32_t() : RandomInt32();
    110     LOG(INFO) << "arg3 = " << arg3;
    111         typedef void* (*func_type_send)(...);
    112     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_send) target_loader_.GetLoaderFunction("send"))(
    113           arg0,
    114           arg1,
    115           arg2,
    116           arg3)));
    117         return true;
    118       }
    119     if (!strcmp(func_name, "fopen")) {
    120         char arg0[func_msg->arg(0).string_value().length() + 1];
    121         if (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).string_value().has_message()) {
    122           strcpy(arg0, func_msg->arg(0).string_value().message().c_str());
    123         } else {
    124        strcpy(arg0, RandomCharPointer());
    125         }
    126     ;
    127     LOG(INFO) << "arg0 = " << arg0;
    128         char arg1[func_msg->arg(1).string_value().length() + 1];
    129         if (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).string_value().has_message()) {
    130           strcpy(arg1, func_msg->arg(1).string_value().message().c_str());
    131         } else {
    132        strcpy(arg1, RandomCharPointer());
    133         }
    134     ;
    135     LOG(INFO) << "arg1 = " << arg1;
    136         typedef void* (*func_type_fopen)(...);
    137     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_fopen) target_loader_.GetLoaderFunction("fopen"))(
    138           arg0,
    139           arg1)));
    140         return true;
    141       }
    142     if (!strcmp(func_name, "read")) {
    143         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
    144     LOG(INFO) << "arg0 = " << arg0;
    145         void* arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_void_pointer()) ? reinterpret_cast<void*>(func_msg->arg(1).scalar_value().void_pointer()) : RandomVoidPointer();
    146     LOG(INFO) << "arg1 = " << arg1;
    147         uint32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_uint32_t()) ? func_msg->arg(2).scalar_value().uint32_t() : RandomUint32();
    148     LOG(INFO) << "arg2 = " << arg2;
    149         typedef void* (*func_type_read)(...);
    150     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_read) target_loader_.GetLoaderFunction("read"))(
    151           arg0,
    152           arg1,
    153           arg2)));
    154         return true;
    155       }
    156     if (!strcmp(func_name, "write")) {
    157         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
    158     LOG(INFO) << "arg0 = " << arg0;
    159         void* arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_void_pointer()) ? reinterpret_cast<void*>(func_msg->arg(1).scalar_value().void_pointer()) : RandomVoidPointer();
    160     LOG(INFO) << "arg1 = " << arg1;
    161         int32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_int32_t()) ? func_msg->arg(2).scalar_value().int32_t() : RandomInt32();
    162     LOG(INFO) << "arg2 = " << arg2;
    163         typedef void* (*func_type_write)(...);
    164     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_write) target_loader_.GetLoaderFunction("write"))(
    165           arg0,
    166           arg1,
    167           arg2)));
    168         return true;
    169       }
    170     if (!strcmp(func_name, "lseek")) {
    171         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
    172     LOG(INFO) << "arg0 = " << arg0;
    173         int32_t arg1 = (func_msg->arg(1).type() == TYPE_SCALAR && func_msg->arg(1).scalar_value().has_int32_t()) ? func_msg->arg(1).scalar_value().int32_t() : RandomInt32();
    174     LOG(INFO) << "arg1 = " << arg1;
    175         int32_t arg2 = (func_msg->arg(2).type() == TYPE_SCALAR && func_msg->arg(2).scalar_value().has_int32_t()) ? func_msg->arg(2).scalar_value().int32_t() : RandomInt32();
    176     LOG(INFO) << "arg2 = " << arg2;
    177         typedef void* (*func_type_lseek)(...);
    178     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_lseek) target_loader_.GetLoaderFunction("lseek"))(
    179           arg0,
    180           arg1,
    181           arg2)));
    182         return true;
    183       }
    184     if (!strcmp(func_name, "close")) {
    185         int32_t arg0 = (func_msg->arg(0).type() == TYPE_SCALAR && func_msg->arg(0).scalar_value().has_int32_t()) ? func_msg->arg(0).scalar_value().int32_t() : RandomInt32();
    186     LOG(INFO) << "arg0 = " << arg0;
    187         typedef void* (*func_type_close)(...);
    188     *result = const_cast<void*>(reinterpret_cast<const void*>(    ((func_type_close) target_loader_.GetLoaderFunction("close"))(
    189           arg0)));
    190         return true;
    191       }
    192     return false;
    193 }
    194 bool FuzzerExtended_libc::GetAttribute(
    195     FunctionSpecificationMessage* func_msg,
    196     void** result) {
    197     const char* func_name = func_msg->name().c_str();
    198     LOG(INFO) << " '" << func_name << "'";
    199     LOG(ERROR) << "attribute not supported for shared lib yet.";
    200     return false;
    201 }
    202 bool FuzzerExtended_libc::CallFunction(const FunctionSpecificationMessage&, const string&, FunctionSpecificationMessage* ) {
    203     /* No implementation yet. */
    204     return true;
    205 }
    206 bool FuzzerExtended_libc::VerifyResults(const FunctionSpecificationMessage&, const FunctionSpecificationMessage&) {
    207     /* No implementation yet. */
    208     return true;
    209 }
    210 extern "C" {
    211 android::vts::DriverBase* vts_func_11_1002_V1_0_() {
    212     return (android::vts::DriverBase*) new android::vts::FuzzerExtended_libc();
    213 }
    214 
    215 }
    216 }  // namespace vts
    217 }  // namespace android
    218