pike.git / src / opcodes.c

version» Context lines:

pike.git/src/opcodes.c:422:   }      static INT32 low_sscanf(INT32 num_arg)   {    char *input;    int input_len;    char *match;    int match_len;    struct svalue sval;    int e,cnt,matches,eye,arg; -  int no_assign; +  int no_assign,field_length;    char set[256];    struct svalue *argp;       if(num_arg < 2) error("Too few arguments to sscanf.\n");    argp=sp-num_arg;       if(argp[0].type != T_STRING) error("Bad argument 1 to sscanf.\n");    if(argp[1].type != T_STRING) error("Bad argument 2 to sscanf.\n");       input=argp[0].u.string->str;
pike.git/src/opcodes.c:466:    }    if(cnt>=match_len) return matches;      #ifdef DEBUG    if(match[cnt]!='%' || match[cnt+1]=='%')    {    fatal("Error in sscanf.\n");    }   #endif    +  no_assign=0; +  field_length=-1; +     cnt++;    if(cnt>=match_len)    error("Error in sscanf format string.\n");    -  if(match[cnt]=='*') +  while(1)    { -  +  switch(match[cnt]) +  { +  case '*':    no_assign=1;    cnt++;    if(cnt>=match_len)    error("Error in sscanf format string.\n"); -  }else{ -  no_assign=0; -  } +  continue;    -  switch(match[cnt]) +  case '0': case '1': case '2': case '3': case '4': +  case '5': case '6': case '7': case '8': case '9':    { -  +  char *t; +  field_length=STRTOL(match+cnt,&t,10); +  cnt=t-match; +  continue; +  } +     case 'c': -  if(eye>=input_len) return matches; +  if(field_length == -1) field_length = 1; +  if(eye+field_length > input_len) return matches;    sval.type=T_INT;    sval.subtype=NUMBER_NUMBER; -  sval.u.integer=EXTRACT_UCHAR(input+eye); +  sval.u.integer=0; +  while(--field_length >= 0) +  { +  sval.u.integer<<=8; +  sval.u.integer|=EXTRACT_UCHAR(input+eye);    eye++; -  +  }    break;       case 'd':    {    char * t;       if(eye>=input_len) return matches;    sval.u.integer=STRTOL(input+eye,&t,10);    if(input + eye == t) return matches;    eye=t-input;
pike.git/src/opcodes.c:558:    if(input + eye == t) return matches;    eye=t-input;    sval.type=T_FLOAT;   #ifdef __CHECKER__    sval.subtype=0;   #endif    break;    }       case 's': +  if(field_length != -1) +  { +  if(input_len - eye < field_length) +  return matches; +  +  sval.type=T_STRING; + #ifdef __CHECKER__ +  sval.subtype=0; + #endif +  sval.u.string=make_shared_binary_string(input+eye,field_length); +  eye+=field_length; +  break; +  } +     if(cnt+1>=match_len)    {    sval.type=T_STRING;   #ifdef __CHECKER__    sval.subtype=0;   #endif    sval.u.string=make_shared_binary_string(input+eye,input_len-eye); -  +  eye=input_len;    break;    }else{    char *end_str_start;    char *end_str_end;    char *s=0; /* make gcc happy */    char *p=0; /* make gcc happy */    int start,contains_percent_percent, new_eye;       start=eye;    end_str_start=match+cnt+1;
pike.git/src/opcodes.c:706:       case 'n':    sval.type=T_INT;    sval.subtype=NUMBER_NUMBER;    sval.u.integer=eye;    break;       default:    error("Unknown sscanf token %%%c\n",match[cnt]);    } +  break; +  }    matches++;       if(!no_assign)    {    arg++;    if((num_arg-2)/2<arg)    {    free_svalue(&sval);    error("Too few arguments for format to sscanf.\n");    }