/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugins.d/mandos-client.c

  • Committer: Teddy Hogeborn
  • Date: 2011-08-07 14:49:02 UTC
  • Revision ID: teddy@fukt.bsnet.se-20110807144902-ika77xz6rgaijwmw
* plugins.d/mandos-client.c (main): Do not even try to work around
                                    Debian bug 633582 if --seckey or
                                    --pubkey specifies a different
                                    directory.  Bug fix: Remove all
                                    files in GPG temporary directory.

Show diffs side-by-side

added added

removed removed

Lines of Context:
283
283
    return false;
284
284
  }
285
285
  
286
 
    /* Set GPGME home directory for the OpenPGP engine only */
 
286
  /* Set GPGME home directory for the OpenPGP engine only */
287
287
  rc = gpgme_get_engine_info(&engine_info);
288
288
  if(rc != GPG_ERR_NO_ERROR){
289
289
    fprintf(stderr, "bad gpgme_get_engine_info: %s: %s\n",
1470
1470
      perror_plus("seteuid");
1471
1471
    }
1472
1472
    
1473
 
    int seckey_fd = open(PATHDIR "/" SECKEY, O_RDONLY);
1474
 
    if(seckey_fd == -1){
1475
 
      perror_plus("open");
1476
 
    } else {
1477
 
      ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
1478
 
      if(ret == -1){
1479
 
        perror_plus("fstat");
 
1473
    if(strcmp(seckey, PATHDIR "/" SECKEY) == 0){
 
1474
      int seckey_fd = open(seckey, O_RDONLY);
 
1475
      if(seckey_fd == -1){
 
1476
        perror_plus("open");
1480
1477
      } else {
1481
 
        if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1482
 
          ret = fchown(seckey_fd, uid, gid);
1483
 
          if(ret == -1){
1484
 
            perror_plus("fchown");
 
1478
        ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
 
1479
        if(ret == -1){
 
1480
          perror_plus("fstat");
 
1481
        } else {
 
1482
          if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
 
1483
            ret = fchown(seckey_fd, uid, gid);
 
1484
            if(ret == -1){
 
1485
              perror_plus("fchown");
 
1486
            }
1485
1487
          }
1486
1488
        }
 
1489
        TEMP_FAILURE_RETRY(close(seckey_fd));
1487
1490
      }
1488
 
      TEMP_FAILURE_RETRY(close(seckey_fd));
1489
1491
    }
1490
1492
    
1491
 
    int pubkey_fd = open(PATHDIR "/" PUBKEY, O_RDONLY);
1492
 
    if(pubkey_fd == -1){
1493
 
      perror_plus("open");
1494
 
    } else {
1495
 
      ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
1496
 
      if(ret == -1){
1497
 
        perror_plus("fstat");
 
1493
    if(strcmp(pubkey, PATHDIR "/" PUBKEY) == 0){
 
1494
      int pubkey_fd = open(pubkey, O_RDONLY);
 
1495
      if(pubkey_fd == -1){
 
1496
        perror_plus("open");
1498
1497
      } else {
1499
 
        if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1500
 
          ret = fchown(pubkey_fd, uid, gid);
1501
 
          if(ret == -1){
1502
 
            perror_plus("fchown");
 
1498
        ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
 
1499
        if(ret == -1){
 
1500
          perror_plus("fstat");
 
1501
        } else {
 
1502
          if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
 
1503
            ret = fchown(pubkey_fd, uid, gid);
 
1504
            if(ret == -1){
 
1505
              perror_plus("fchown");
 
1506
            }
1503
1507
          }
1504
1508
        }
 
1509
        TEMP_FAILURE_RETRY(close(pubkey_fd));
1505
1510
      }
1506
 
      TEMP_FAILURE_RETRY(close(pubkey_fd));
1507
1511
    }
1508
1512
    
1509
1513
    /* Lower privileges */
1860
1864
                (int)retry_interval);
1861
1865
      }
1862
1866
      sleep((int)retry_interval);
1863
 
    };
1864
 
 
 
1867
    }
 
1868
    
1865
1869
    if (not quit_now){
1866
1870
      exitcode = EXIT_SUCCESS;
1867
1871
    }
2004
2008
  if(tempdir_created){
2005
2009
    struct dirent **direntries = NULL;
2006
2010
    struct dirent *direntry = NULL;
2007
 
    ret = scandir(tempdir, &direntries, notdotentries, alphasort);
2008
 
    if (ret > 0){
2009
 
      for(int i = 0; i < ret; i++){
 
2011
    int numentries = scandir(tempdir, &direntries, notdotentries,
 
2012
                             alphasort);
 
2013
    if (numentries > 0){
 
2014
      for(int i = 0; i < numentries; i++){
2010
2015
        direntry = direntries[i];
2011
2016
        char *fullname = NULL;
2012
2017
        ret = asprintf(&fullname, "%s/%s", tempdir,
2024
2029
      }
2025
2030
    }
2026
2031
 
2027
 
    /* need to be cleaned even if ret == 0 because man page doesn't
2028
 
       specify */
 
2032
    /* need to clean even if 0 because man page doesn't specify */
2029
2033
    free(direntries);
2030
 
    if (ret == -1){
 
2034
    if (numentries == -1){
2031
2035
      perror_plus("scandir");
2032
2036
    }
2033
2037
    ret = rmdir(tempdir);