/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/plymouth.c

  • Committer: Teddy Hogeborn
  • Date: 2015-07-20 03:03:33 UTC
  • Revision ID: teddy@recompile.se-20150720030333-203m2aeblypcsfte
Bug fix for GnuTLS 3: be compatible with old 2048-bit DSA keys.

The mandos-keygen program in Mandos version 1.6.0 and older generated
2048-bit DSA keys, and when GnuTLS uses these it has trouble
connecting using the Mandos default priority string.  This was
previously fixed in Mandos 1.6.2, but the bug reappeared when using
GnuTLS 3, so the default priority string has to change again; this
time also the Mandos client has to change its default, so now the
server and the client should use the same default priority string:

SECURE256:!CTYPE-X.509:+CTYPE-OPENPGP:!RSA:+SIGN-DSA-SHA256

* mandos (main/server_defaults): Changed default priority string.
* mandos-options.xml (/section/para[id="priority_compat"]): Removed.
  (/section/para[id="priority"]): Changed default priority string.
* mandos.conf ([DEFAULT]/priority): - '' -
* mandos.conf.xml (OPTIONS/priority): Refer to the id "priority"
                                      instead of "priority_compat".
* mandos.xml (OPTIONS/--priority): - '' -
* plugins.d/mandos-client.c (main): Changed default priority string.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
/*
3
3
 * Plymouth - Read a password from Plymouth and output it
4
4
 * 
5
 
 * Copyright © 2010-2011 Teddy Hogeborn
6
 
 * Copyright © 2010-2011 Björn Påhlsson
 
5
 * Copyright © 2010-2014 Teddy Hogeborn
 
6
 * Copyright © 2010-2014 Björn Påhlsson
7
7
 * 
8
8
 * This program is free software: you can redistribute it and/or
9
9
 * modify it under the terms of the GNU General Public License as
84
84
  
85
85
  va_start(ap, formatstring);
86
86
  ret = vasprintf(&text, formatstring, ap);
87
 
  if (ret == -1){
 
87
  if(ret == -1){
88
88
    fprintf(stderr, "Mandos plugin %s: ",
89
89
            program_invocation_short_name);
90
90
    vfprintf(stderr, formatstring, ap);
156
156
 
157
157
__attribute__((nonnull (2, 3)))
158
158
bool exec_and_wait(pid_t *pid_return, const char *path,
159
 
                   const char **argv, bool interruptable,
 
159
                   const char * const *argv, bool interruptable,
160
160
                   bool daemonize){
161
161
  int status;
162
162
  int ret;
179
179
    int i = 0;
180
180
    for (; argv[i]!=NULL; i++){
181
181
      tmp = realloc(new_argv, sizeof(const char *) * ((size_t)i + 1));
182
 
      if (tmp == NULL){
 
182
      if(tmp == NULL){
183
183
        error_plus(0, errno, "realloc");
184
184
        free(new_argv);
185
185
        _exit(EX_OSERR);
218
218
int is_plymouth(const struct dirent *proc_entry){
219
219
  int ret;
220
220
  {
221
 
    uintmax_t maxvalue;
 
221
    uintmax_t proc_id;
222
222
    char *tmp;
223
223
    errno = 0;
224
 
    maxvalue = strtoumax(proc_entry->d_name, &tmp, 10);
 
224
    proc_id = strtoumax(proc_entry->d_name, &tmp, 10);
225
225
 
226
226
    if(errno != 0 or *tmp != '\0'
227
 
       or maxvalue != (uintmax_t)((pid_t)maxvalue)){
 
227
       or proc_id != (uintmax_t)((pid_t)proc_id)){
228
228
      return 0;
229
229
    }
230
230
  }
265
265
 
266
266
pid_t get_pid(void){
267
267
  int ret;
268
 
  uintmax_t maxvalue = 0;
 
268
  uintmax_t proc_id = 0;
269
269
  FILE *pidfile = fopen(plymouth_pid, "r");
270
270
  /* Try the new pid file location */
271
271
  if(pidfile != NULL){
272
 
    ret = fscanf(pidfile, "%" SCNuMAX, &maxvalue);
 
272
    ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
273
273
    if(ret != 1){
274
 
      maxvalue = 0;
 
274
      proc_id = 0;
275
275
    }
276
276
    fclose(pidfile);
277
277
  }
278
278
  /* Try the old pid file location */
279
 
  if(maxvalue == 0){
 
279
  if(proc_id == 0){
280
280
    pidfile = fopen(plymouth_pid, "r");
281
281
    if(pidfile != NULL){
282
 
      ret = fscanf(pidfile, "%" SCNuMAX, &maxvalue);
 
282
      ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
283
283
      if(ret != 1){
284
 
        maxvalue = 0;
 
284
        proc_id = 0;
285
285
      }
286
286
      fclose(pidfile);
287
287
    }
288
288
  }
289
289
  /* Look for a plymouth process */
290
 
  if(maxvalue == 0){
 
290
  if(proc_id == 0){
291
291
    struct dirent **direntries = NULL;
292
292
    ret = scandir("/proc", &direntries, is_plymouth, alphasort);
293
 
    if (ret == -1){
 
293
    if(ret == -1){
294
294
      error_plus(0, errno, "scandir");
295
295
    }
296
 
    if (ret > 0){
297
 
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &maxvalue);
298
 
      if (ret < 0){
 
296
    if(ret > 0){
 
297
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &proc_id);
 
298
      if(ret < 0){
299
299
        error_plus(0, errno, "sscanf");
300
300
      }
301
301
    }
304
304
    free(direntries);
305
305
  }
306
306
  pid_t pid;
307
 
  pid = (pid_t)maxvalue;
308
 
  if((uintmax_t)pid == maxvalue){
 
307
  pid = (pid_t)proc_id;
 
308
  if((uintmax_t)pid == proc_id){
309
309
    return pid;
310
310
  }
311
311
  
312
312
  return 0;
313
313
}
314
314
 
315
 
const char **getargv(pid_t pid){
 
315
const char * const * getargv(pid_t pid){
316
316
  int cl_fd;
317
317
  char *cmdline_filename;
318
318
  ssize_t sret;
379
379
    return NULL;
380
380
  }
381
381
  argz_extract(cmdline, cmdline_len, argv); /* Create argv */
382
 
  return (const char **)argv;
 
382
  return (const char * const *)argv;
383
383
}
384
384
 
385
385
int main(__attribute__((unused))int argc,
460
460
  }
461
461
  kill_and_wait(plymouth_command_pid);
462
462
  
463
 
  const char **plymouthd_argv;
 
463
  const char * const *plymouthd_argv;
464
464
  pid_t pid = get_pid();
465
465
  if(pid == 0){
466
466
    error_plus(0, 0, "plymouthd pid not found");