/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);
154
154
  return true;
155
155
}
156
156
 
 
157
__attribute__((nonnull (2, 3)))
157
158
bool exec_and_wait(pid_t *pid_return, const char *path,
158
 
                   const char **argv, bool interruptable,
 
159
                   const char * const *argv, bool interruptable,
159
160
                   bool daemonize){
160
161
  int status;
161
162
  int ret;
178
179
    int i = 0;
179
180
    for (; argv[i]!=NULL; i++){
180
181
      tmp = realloc(new_argv, sizeof(const char *) * ((size_t)i + 1));
181
 
      if (tmp == NULL){
 
182
      if(tmp == NULL){
182
183
        error_plus(0, errno, "realloc");
183
184
        free(new_argv);
184
185
        _exit(EX_OSERR);
213
214
  return false;
214
215
}
215
216
 
 
217
__attribute__((nonnull))
216
218
int is_plymouth(const struct dirent *proc_entry){
217
219
  int ret;
218
220
  {
219
 
    uintmax_t maxvalue;
 
221
    uintmax_t proc_id;
220
222
    char *tmp;
221
223
    errno = 0;
222
 
    maxvalue = strtoumax(proc_entry->d_name, &tmp, 10);
 
224
    proc_id = strtoumax(proc_entry->d_name, &tmp, 10);
223
225
 
224
226
    if(errno != 0 or *tmp != '\0'
225
 
       or maxvalue != (uintmax_t)((pid_t)maxvalue)){
 
227
       or proc_id != (uintmax_t)((pid_t)proc_id)){
226
228
      return 0;
227
229
    }
228
230
  }
263
265
 
264
266
pid_t get_pid(void){
265
267
  int ret;
266
 
  uintmax_t maxvalue = 0;
 
268
  uintmax_t proc_id = 0;
267
269
  FILE *pidfile = fopen(plymouth_pid, "r");
268
270
  /* Try the new pid file location */
269
271
  if(pidfile != NULL){
270
 
    ret = fscanf(pidfile, "%" SCNuMAX, &maxvalue);
 
272
    ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
271
273
    if(ret != 1){
272
 
      maxvalue = 0;
 
274
      proc_id = 0;
273
275
    }
274
276
    fclose(pidfile);
275
277
  }
276
278
  /* Try the old pid file location */
277
 
  if(maxvalue == 0){
 
279
  if(proc_id == 0){
278
280
    pidfile = fopen(plymouth_pid, "r");
279
281
    if(pidfile != NULL){
280
 
      ret = fscanf(pidfile, "%" SCNuMAX, &maxvalue);
 
282
      ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
281
283
      if(ret != 1){
282
 
        maxvalue = 0;
 
284
        proc_id = 0;
283
285
      }
284
286
      fclose(pidfile);
285
287
    }
286
288
  }
287
289
  /* Look for a plymouth process */
288
 
  if(maxvalue == 0){
 
290
  if(proc_id == 0){
289
291
    struct dirent **direntries = NULL;
290
292
    ret = scandir("/proc", &direntries, is_plymouth, alphasort);
291
 
    if (ret == -1){
 
293
    if(ret == -1){
292
294
      error_plus(0, errno, "scandir");
293
295
    }
294
 
    if (ret > 0){
295
 
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &maxvalue);
296
 
      if (ret < 0){
 
296
    if(ret > 0){
 
297
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &proc_id);
 
298
      if(ret < 0){
297
299
        error_plus(0, errno, "sscanf");
298
300
      }
299
301
    }
302
304
    free(direntries);
303
305
  }
304
306
  pid_t pid;
305
 
  pid = (pid_t)maxvalue;
306
 
  if((uintmax_t)pid == maxvalue){
 
307
  pid = (pid_t)proc_id;
 
308
  if((uintmax_t)pid == proc_id){
307
309
    return pid;
308
310
  }
309
311
  
310
312
  return 0;
311
313
}
312
314
 
313
 
const char **getargv(pid_t pid){
 
315
const char * const * getargv(pid_t pid){
314
316
  int cl_fd;
315
317
  char *cmdline_filename;
316
318
  ssize_t sret;
377
379
    return NULL;
378
380
  }
379
381
  argz_extract(cmdline, cmdline_len, argv); /* Create argv */
380
 
  return (const char **)argv;
 
382
  return (const char * const *)argv;
381
383
}
382
384
 
383
385
int main(__attribute__((unused))int argc,
458
460
  }
459
461
  kill_and_wait(plymouth_command_pid);
460
462
  
461
 
  const char **plymouthd_argv;
 
463
  const char * const *plymouthd_argv;
462
464
  pid_t pid = get_pid();
463
465
  if(pid == 0){
464
466
    error_plus(0, 0, "plymouthd pid not found");