Changeset 43c65f5 in rtems-libbsd


Ignore:
Timestamp:
Apr 26, 2017, 7:39:38 AM (2 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
fd86c091b97759106da7355ce1dd81ebe030e285, f020f08430150c1656a0ad0a1de13699db9b980b
Children:
4437573
Parents:
145a821
git-author:
Chris Johns <chrisj@…> (04/26/17 07:39:38)
git-committer:
Chris Johns <chrisj@…> (04/26/17 07:43:30)
Message:

rc_conf: Do not use a local variable for the rc_conf context.

If a network error occurs or there is no waiter on rc_conf
processing the worker thread is left holding a local stack
struct ater the call has returned. Allocate on the heap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemsbsd/rtems/rtems-bsd-rc-conf.c

    r145a821 r43c65f5  
    209209  sc = rtems_semaphore_obtain(rc_conf->lock, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
    210210  if (sc != RTEMS_SUCCESSFUL) {
    211     fprintf(stderr, "error: rc_conf: locking: %s", rtems_status_text(sc));
     211    fprintf(stderr, "error: rc_conf: locking: %s\n", rtems_status_text(sc));
    212212    errno = EIO;
    213213    return -1;
     
    222222  sc = rtems_semaphore_release(rc_conf->lock);
    223223  if (sc != RTEMS_SUCCESSFUL) {
    224     fprintf(stderr, "error: rc_conf: locking: %s", rtems_status_text(sc));
     224    fprintf(stderr, "error: rc_conf: locking: %s\n", rtems_status_text(sc));
    225225    errno = EIO;
    226226    return -1;
     
    230230
    231231static int
    232 rc_conf_create(rtems_bsd_rc_conf* rc_conf,
    233                const char*        name,
    234                const char*        text,
    235                int                timeout,
    236                bool               verbose)
    237 {
    238   size_t       length;
    239   char*        line;
    240   char*        end;
    241   char*        copy;
    242   char*        marker;
    243   const char** lines;
    244   size_t       line_count;
    245   int          r;
    246 
    247   memset(rc_conf, 0, sizeof(*rc_conf));
     232rc_conf_create(rtems_bsd_rc_conf** rc_conf,
     233               const char*         name,
     234               const char*         text,
     235               int                 timeout,
     236               bool                verbose)
     237{
     238  rtems_bsd_rc_conf* _rc_conf;
     239  size_t             length;
     240  char*              line;
     241  char*              end;
     242  char*              copy;
     243  char*              marker;
     244  const char**       lines;
     245  size_t             line_count;
     246  int                r;
     247
     248  *rc_conf = NULL;
     249
     250  _rc_conf = malloc(sizeof(rtems_bsd_rc_conf));
     251  if (_rc_conf == NULL) {
     252    errno = ENOMEM;
     253    return -1;
     254  }
     255
     256  memset(_rc_conf, 0, sizeof(rtems_bsd_rc_conf));
    248257
    249258  /*
     
    317326  }
    318327
    319   rc_conf->name = strdup(name);
    320   rc_conf->data = copy;
    321   rc_conf->line_count = line_count;
    322   rc_conf->lines = lines;
    323   rc_conf->line = 0;
    324   rc_conf->timeout = timeout;
    325   rc_conf->verbose = verbose;
     328  _rc_conf->name = strdup(name);
     329  _rc_conf->data = copy;
     330  _rc_conf->line_count = line_count;
     331  _rc_conf->lines = lines;
     332  _rc_conf->line = 0;
     333  _rc_conf->timeout = timeout;
     334  _rc_conf->verbose = verbose;
    326335  if (timeout >= 0)
    327     rc_conf->waiter = rtems_task_self();
     336    _rc_conf->waiter = rtems_task_self();
    328337
    329338  /*
    330339   * Create the lock.
    331340   */
    332   r = lock_create(rc_conf);
     341  r = lock_create(_rc_conf);
    333342  if (r < 0) {
    334     free((void*) rc_conf->name);
    335     free((void*) rc_conf->lines);
    336     free((void*) rc_conf->data);
    337     return -1;
    338   }
     343    free((void*) _rc_conf->name);
     344    free((void*) _rc_conf->lines);
     345    free((void*) _rc_conf->data);
     346    return -1;
     347  }
     348
     349  *rc_conf = _rc_conf;
    339350
    340351  return 0;
     
    344355rc_conf_destroy(rtems_bsd_rc_conf* rc_conf)
    345356{
    346   if (rc_conf->name != NULL) {
     357  if (rc_conf != NULL && rc_conf->name != NULL) {
    347358    free((void*) rc_conf->name);
    348359    free((void*) rc_conf->lines);
     
    352363    rc_conf->data = NULL;
    353364    lock_delete(rc_conf);
     365    free((void*) rc_conf);
    354366  }
    355367}
     
    422434    if (r == 0)
    423435      return 0;
    424 
    425     regfree(&rege);
    426436  }
    427437
     
    439449  if (argc_argv_valid(argc_argv) < 0)
    440450    return -1;
     451  rc_conf->line = 0;
    441452  free(rc_conf->find_regex);
    442453  rc_conf->find_regex = strdup(expression);
    443   rc_conf->line = 0;
    444454  if (rc_conf->find_regex == NULL) {
    445455    errno = ENOMEM;
     
    763773                             bool        verbose)
    764774{
    765   rtems_bsd_rc_conf   rc_conf;
     775  rtems_bsd_rc_conf*  rc_conf;
    766776  rtems_task_priority priority;
    767777  rtems_id            worker;
     
    802812  sc = rtems_task_start(worker,
    803813                        rc_conf_worker,
    804                         (rtems_task_argument) &rc_conf);
     814                        (rtems_task_argument) rc_conf);
    805815  if (sc != RTEMS_SUCCESSFUL) {
    806816    fprintf (stderr, "error: worker start: %s", rtems_status_text(sc));
     
    828838      }
    829839      else {
    830         lock(&rc_conf);
    831         rc_conf.waiter = 0;
    832         unlock(&rc_conf);
     840        lock(rc_conf);
     841        rc_conf->waiter = 0;
     842        unlock(rc_conf);
    833843        errno = ETIMEDOUT;
    834844      }
     
    836846    }
    837847    else {
    838       lock(&rc_conf);
    839       errno = rc_conf.error_code;
     848      lock(rc_conf);
     849      errno = rc_conf->error_code;
    840850      if (errno != 0)
    841851        r = -1;
    842       unlock(&rc_conf);
    843       rc_conf_destroy(&rc_conf);
     852      unlock(rc_conf);
     853      rc_conf_destroy(rc_conf);
    844854    }
    845855  }
Note: See TracChangeset for help on using the changeset viewer.