Changeset 7b1f1483fcd24bdc23d2a6c5c92e903530b1df04

Show
Ignore:
Timestamp:
06/12/09 20:57:12 (5 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1244840232 +0000
git-parent:

[2eb472696f4703f1409ebcf61f49a70ef9184783]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1244840232 +0000
Message:

Fix the 'unsafe' strcpy() stuff. It was just killing me on OpenBSD.

Also, [31] introduced a bug that prevents starting people in mid stream with JLOG_BEGIN whence. Fixed that.

Optimize the JLOG_BEGIN whence add subscriber case.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • jlog.c

    r1a48c14 r7b1f148  
    329329static int __jlog_unlink_datafile(jlog_ctx *ctx, u_int32_t log) { 
    330330  char file[MAXPATHLEN]; 
     331  int len; 
    331332 
    332333  if(ctx->current_log == log) { 
     
    341342  unlink(file); 
    342343 
    343   strcat(file, INDEX_EXT); 
     344  len = strlen(file); 
     345  if((len + sizeof(INDEX_EXT)) > sizeof(file)) return -1; 
     346  memcpy(file + len, INDEX_EXT, sizeof(INDEX_EXT)); 
    344347#ifdef DEBUG 
    345348  fprintf(stderr, "unlinking %s\n", file); 
     
    357360  fprintf(stderr, "__jlog_open_metastore\n"); 
    358361#endif 
    359   strcpy(file, ctx->path); 
    360362  len = strlen(ctx->path); 
     363  if((len + 1 /* IFS_CH */ + 9 /* "metastore" */ + 1) > MAXPATHLEN) { 
     364#ifdef ENAMETOOLONG 
     365    ctx->last_errno = ENAMETOOLONG; 
     366#endif 
     367    ctx->last_error = JLOG_ERR_CREATE_META; 
     368    return -1; 
     369  } 
     370  memcpy(file, ctx->path, len); 
    361371  file[len++] = IFS_CH; 
    362   strcpy(&file[len], "metastore"); 
     372  memcpy(&file[len], "metastore", 10); /* "metastore" + '\0' */ 
    363373 
    364374  ctx->metastore = jlog_file_open(file, O_CREAT, ctx->file_mode); 
     
    387397  if (!dir) return -1; 
    388398   
    389   strcpy(file, ctx->path); 
    390399  len = strlen(ctx->path); 
     400  if(len + 2 > sizeof(file)) return -1; 
     401  memcpy(file, ctx->path, len); 
    391402  file[len++] = IFS_CH; 
    392403  file[len] = '\0'; 
     
    395406    if (ent->d_name[0] == 'c' && ent->d_name[1] == 'p' && ent->d_name[2] == '.') { 
    396407      jlog_file *cp; 
    397  
    398       strcpy(file + len, ent->d_name); 
     408      int dlen; 
     409 
     410      dlen = strlen(ent->d_name); 
     411      if((len + dlen + 1) > sizeof(file)) continue; 
     412      memcpy(file + len, ent->d_name, dlen + 1); /* include \0 */ 
    399413#ifdef DEBUG 
    400414      fprintf(stderr, "Checking if %s needs %s...\n", ent->d_name, ctx->path); 
     
    620634  /* build checkpoint filename */ 
    621635  len = strlen(ctx->path); 
    622   strcpy(name, ctx->path); 
     636  memcpy(name, ctx->path, len); 
    623637  name[len++] = IFS_CH; 
    624638  name[len++] = 'c'; 
     
    736750static jlog_file *__jlog_open_indexer(jlog_ctx *ctx, u_int32_t log) { 
    737751  char file[MAXPATHLEN]; 
     752  int len; 
    738753 
    739754  if(ctx->current_log != log) { 
     
    745760  } 
    746761  STRSETDATAFILE(ctx, file, log); 
    747   strcat(file, INDEX_EXT); 
     762 
     763  len = strlen(file); 
     764  if((len + sizeof(INDEX_EXT)) > sizeof(file)) return NULL; 
     765  memcpy(file + len, INDEX_EXT, sizeof(INDEX_EXT)); 
    748766#ifdef DEBUG 
    749767  fprintf(stderr, "opening index file: '%s'\n", idx); 
     
    970988  while((de = readdir(d)) != NULL) { 
    971989    struct stat sb; 
    972     strcpy(filename+len, de->d_name); 
     990    int dlen; 
     991 
     992    dlen = strlen(de->d_name); 
     993    if((len + dlen + 1) > sizeof(filename)) continue; 
     994    memcpy(filename+len, de->d_name, dlen + 1); /* include \0 */ 
    973995    while((ferr = stat(filename, &sb)) == -1 && errno == EINTR); 
    974996    if(ferr == 0 && S_ISREG(sb.st_mode)) totalsize += sb.st_size; 
     
    12561278  if(whence == JLOG_BEGIN) { 
    12571279    memset(&chkpt, 0, sizeof(chkpt)); 
     1280    jlog_ctx_first_log_id(ctx, &chkpt); 
    12581281    if(__jlog_set_checkpoint(ctx, s, &chkpt) != 0) { 
    12591282      ctx->last_error = JLOG_ERR_CHECKPOINT; 
     
    13051328        ctx->last_errno == ENOENT) { 
    13061329      char file[MAXPATHLEN]; 
    1307       int ferr
     1330      int ferr, len
    13081331      struct stat sb = {0}; 
    13091332 
     
    13231346        return 0; 
    13241347      } 
    1325       strcat(file, INDEX_EXT); 
     1348      len = strlen(file); 
     1349      if((len + sizeof(INDEX_EXT)) > sizeof(file)) return -1; 
     1350      memcpy(file + len, INDEX_EXT, sizeof(INDEX_EXT)); 
    13261351      while((ferr = stat(file, &sb)) == -1 && errno == EINTR); 
    13271352      if(ferr != 0 || sb.st_size == 0) { 
     
    13431368  if(!memcmp(start, &last, sizeof(last)) && closed) { 
    13441369    char file[MAXPATHLEN]; 
    1345     int ferr
     1370    int ferr, len
    13461371    struct stat sb = {0}; 
    13471372 
     
    13581383      return 0; 
    13591384    } 
    1360     strcat(file, INDEX_EXT); 
     1385    len = strlen(file); 
     1386    if((len + sizeof(INDEX_EXT)) > sizeof(file)) return -1; 
     1387    memcpy(file + len, INDEX_EXT, sizeof(INDEX_EXT)); 
    13611388    while((ferr = stat(file, &sb)) == -1 && errno == EINTR); 
    13621389    if(ferr != 0 || sb.st_size == 0) { 
     
    14831510} 
    14841511 
     1512int jlog_ctx_first_log_id(jlog_ctx *ctx, jlog_id *id) { 
     1513  DIR *d; 
     1514  struct dirent *de; 
     1515  ctx->last_error = JLOG_ERR_SUCCESS; 
     1516  u_int32_t log; 
     1517  int found = 0; 
     1518 
     1519  id->log = 0xffffffff; 
     1520  id->marker = 0; 
     1521  d = opendir(ctx->path); 
     1522  if (!d) return -1; 
     1523 
     1524  while ((de = readdir(d))) { 
     1525    int i; 
     1526    char *cp = de->d_name; 
     1527    if(strlen(cp) != 8) continue; 
     1528    log = 0; 
     1529    for(i=0;i<8;i++) { 
     1530      log <<= 4; 
     1531      if(cp[i] >= '0' && cp[i] <= '9') log |= (cp[i] - '0'); 
     1532      else if(cp[i] >= 'a' && cp[i] <= 'f') log |= (cp[i] - 'a'); 
     1533      else if(cp[i] >= 'A' && cp[i] <= 'F') log |= (cp[i] - 'A'); 
     1534      else break; 
     1535    } 
     1536    if(i != 8) continue; 
     1537    found = 1; 
     1538    if(log < id->log) id->log = log; 
     1539  } 
     1540  if(!found) id->log = 0; 
     1541  closedir(d); 
     1542  return 0; 
     1543} 
     1544 
    14851545int jlog_ctx_last_log_id(jlog_ctx *ctx, jlog_id *id) { 
    14861546  ctx->last_error = JLOG_ERR_SUCCESS; 
  • jlog.h

    rb6b39fc r7b1f148  
    150150 
    151151JLOG_API(int)       __jlog_pending_readers(jlog_ctx *ctx, u_int32_t log); 
     152JLOG_API(int)       jlog_ctx_first_log_id(jlog_ctx *ctx, jlog_id *id); 
    152153JLOG_API(int)       jlog_ctx_last_log_id(jlog_ctx *ctx, jlog_id *id); 
    153154JLOG_API(int)       jlog_ctx_advance_id(jlog_ctx *ctx, jlog_id *cur,  
  • jlog_private.h

    r2eb4726 r7b1f148  
    9595  int __len; \ 
    9696  __len = strlen((ctx)->path); \ 
    97   strcpy((file), (ctx)->path); \ 
     97  memcpy((file), (ctx)->path, __len); \ 
    9898  (file)[__len] = IFS_CH; \ 
    9999  STRLOGID((file)+(__len+1), log); \