Changeset 428 for trunk/src/trustfile.c


Ignore:
Timestamp:
Mar 12, 2013, 9:42:07 PM (12 years ago)
Author:
katerina
Message:

Fix for ticket #335 (warn if buffer for group reading is too small).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/trustfile.c

    r230 r428  
    414414 */
    415415/* not static to circumvent stupid gcc 4 bug */
    416 int isingrp(gid_t grp, uid_t *ulist)
     416int isingrp(gid_t grp, uid_t *ulist, int * errval)
    417417{
    418418  struct passwd *w;             /* info about group member */
     
    420420  register char **p;            /* points to current group member */
    421421  struct group *g;              /* pointer to group information */
     422
     423  int status;
    422424 
    423425#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
     
    430432  SL_ENTER(_("isingrp"));
    431433
     434  *errval = 0;
     435
    432436#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
    433437  buffer = malloc(SH_GRBUF_SIZE);
    434   sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
    435 #else
     438  status = sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
     439#else
     440  errno = 0;
    436441  g = sh_getgrgid(grp);
     442  status = errno;
    437443#endif
    438444
    439445  if (g == NULL)
    440446    {
     447      if (status == ERANGE)
     448        *errval = status;
     449
    441450      goto end_false;
    442451    }
     
    510519 */
    511520/* not static to circumvent stupid gcc 4 bug */
    512 int onlytrustedingrp(gid_t grp, uid_t *ulist)
     521int onlytrustedingrp(gid_t grp, uid_t *ulist, int * errval)
    513522{
    514523  struct passwd *w;             /* info about group member */
     
    518527  register int flag = -1;       /* group member found */
    519528
     529  int status;
     530
    520531#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
    521532  struct group    gr;
     
    529540  SL_ENTER(_("onlytrustedingrp"));
    530541
     542  *errval = 0;
     543
    531544#ifdef TRUST_DEBUG
    532545  fprintf(stderr, "trustfile: group writeable, group_gid: %ld\n",
     
    536549#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
    537550  buffer = malloc(SH_GRBUF_SIZE);
    538   sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
    539 #else
     551  status = sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
     552#else
     553  errno = 0;
    540554  g = sh_getgrgid(grp);
     555  status = errno;
    541556#endif
    542557
    543558  if (g == NULL)
    544559    {
     560      if (status == ERANGE)
     561        *errval = status;
     562
    545563#ifdef TRUST_DEBUG
    546564      fprintf(stderr,
     
    722740  char c;                       /* used to hold temp char          */
    723741 
     742  int errgrp = 0;
     743
    724744  SL_ENTER(_("sl_trustfile"));
    725745  if (fname == NULL)
     
    10101030       */
    10111031      if (((stbuf.st_mode & S_IWGRP) == S_IWGRP) &&
    1012           ((okusers != NULL && !onlytrustedingrp((gid_t)stbuf.st_gid,okusers))||
    1013            (badusers != NULL && isingrp((gid_t)stbuf.st_gid, badusers)))
     1032          ((okusers != NULL && !onlytrustedingrp((gid_t)stbuf.st_gid,okusers,&errgrp))||
     1033           (badusers != NULL && isingrp((gid_t)stbuf.st_gid, badusers,&errgrp)))
    10141034#ifdef STICKY
    10151035          && ((stbuf.st_mode&S_IFDIR) != S_IFDIR ||
     
    10351055          tf_badgid = (gid_t) stbuf.st_gid;
    10361056          free(fexp);
    1037           SL_IRETURN(SL_EBADGID, _("sl_trustfile"));
     1057          SL_IRETURN((errgrp == ERANGE) ? SL_ERANGE : SL_EBADGID, _("sl_trustfile"));
    10381058        }
    10391059      /*
Note: See TracChangeset for help on using the changeset viewer.