/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: 2016-03-17 20:40:55 UTC
  • Revision ID: teddy@recompile.se-20160317204055-bhsh5xsidq7w5cxu
Client: Fix plymouth agent; broken since 1.7.2.

Fix an very old memory bug in the plymouth agent (which has been
present since its apperance in version 1.2), but which was only
recently detected at run time due to the new -fsanitize=address
compile- time flag, which has been used since version 1.7.2.  This
detection of a memory access violation causes the program to abort,
making the Plymouth graphical boot system unable to accept interactive
input of passwords when using the Mandos client.

* plugins.d/plymouth.c (exec_and_wait): Fix memory allocation bug when
  allocating new_argv.  Also tolerate a zero-length argv.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
 * "browse_callback", and parts of "main".
10
10
 * 
11
11
 * Everything else is
12
 
 * Copyright © 2008-2017 Teddy Hogeborn
13
 
 * Copyright © 2008-2017 Björn Påhlsson
14
 
 * 
15
 
 * This file is part of Mandos.
16
 
 * 
17
 
 * Mandos is free software: you can redistribute it and/or modify it
18
 
 * under the terms of the GNU General Public License as published by
19
 
 * the Free Software Foundation, either version 3 of the License, or
20
 
 * (at your option) any later version.
21
 
 * 
22
 
 * Mandos is distributed in the hope that it will be useful, but
 
12
 * Copyright © 2008-2016 Teddy Hogeborn
 
13
 * Copyright © 2008-2016 Björn Påhlsson
 
14
 * 
 
15
 * This program is free software: you can redistribute it and/or
 
16
 * modify it under the terms of the GNU General Public License as
 
17
 * published by the Free Software Foundation, either version 3 of the
 
18
 * License, or (at your option) any later version.
 
19
 * 
 
20
 * This program is distributed in the hope that it will be useful, but
23
21
 * WITHOUT ANY WARRANTY; without even the implied warranty of
24
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25
23
 * General Public License for more details.
26
24
 * 
27
25
 * You should have received a copy of the GNU General Public License
28
 
 * along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
 
26
 * along with this program.  If not, see
 
27
 * <http://www.gnu.org/licenses/>.
29
28
 * 
30
29
 * Contact the authors at <mandos@recompile.se>.
31
30
 */
48
47
                                   strtof(), abort() */
49
48
#include <stdbool.h>            /* bool, false, true */
50
49
#include <string.h>             /* strcmp(), strlen(), strerror(),
51
 
                                   asprintf(), strncpy(), strsignal()
52
 
                                */
 
50
                                   asprintf(), strncpy() */
53
51
#include <sys/ioctl.h>          /* ioctl */
54
52
#include <sys/types.h>          /* socket(), inet_pton(), sockaddr,
55
53
                                   sockaddr_in6, PF_INET6,
627
625
                     safer_gnutls_strerror(ret));
628
626
        dhparamsfilename = NULL;
629
627
      }
630
 
      free(params.data);
631
628
    } while(false);
632
629
  }
633
630
  if(dhparamsfilename == NULL){
1080
1077
    bool match = false;
1081
1078
    {
1082
1079
      char *interface = NULL;
1083
 
      while((interface = argz_next(mc->interfaces,
1084
 
                                   mc->interfaces_size,
1085
 
                                   interface))){
 
1080
      while((interface=argz_next(mc->interfaces, mc->interfaces_size,
 
1081
                                 interface))){
1086
1082
        if(if_nametoindex(interface) == (unsigned int)if_index){
1087
1083
          match = true;
1088
1084
          break;
1241
1237
           with an explicit route added with the server's address.
1242
1238
           
1243
1239
           Avahi bug reference:
1244
 
           https://lists.freedesktop.org/archives/avahi/2010-February/001833.html
 
1240
           http://lists.freedesktop.org/archives/avahi/2010-February/001833.html
1245
1241
           https://bugs.debian.org/587961
1246
1242
        */
1247
1243
        if(debug){
1427
1423
                                               &decrypted_buffer, mc);
1428
1424
    if(decrypted_buffer_size >= 0){
1429
1425
      
1430
 
      clearerr(stdout);
1431
1426
      written = 0;
1432
1427
      while(written < (size_t) decrypted_buffer_size){
1433
1428
        if(quit_now){
1449
1444
        }
1450
1445
        written += (size_t)ret;
1451
1446
      }
1452
 
      ret = fflush(stdout);
1453
 
      if(ret != 0){
1454
 
        int e = errno;
1455
 
        if(debug){
1456
 
          fprintf_plus(stderr, "Error writing encrypted data: %s\n",
1457
 
                       strerror(errno));
1458
 
        }
1459
 
        errno = e;
1460
 
        goto mandos_end;
1461
 
      }
1462
1447
      retval = 0;
1463
1448
    }
1464
1449
  }
1495
1480
  return retval;
1496
1481
}
1497
1482
 
 
1483
__attribute__((nonnull))
1498
1484
static void resolve_callback(AvahiSServiceResolver *r,
1499
1485
                             AvahiIfIndex interface,
1500
1486
                             AvahiProtocol proto,
2197
2183
  
2198
2184
  /* Sleep checking until interface is running.
2199
2185
     Check every 0.25s, up to total time of delay */
2200
 
  for(int i = 0; i < delay * 4; i++){
 
2186
  for(int i=0; i < delay * 4; i++){
2201
2187
    if(interface_is_running(interface)){
2202
2188
      break;
2203
2189
    }
2499
2485
  
2500
2486
  {
2501
2487
    /* Work around Debian bug #633582:
2502
 
       <https://bugs.debian.org/633582> */
 
2488
       <http://bugs.debian.org/633582> */
2503
2489
    
2504
2490
    /* Re-raise privileges */
2505
2491
    ret = raise_privileges();
2960
2946
 end:
2961
2947
  
2962
2948
  if(debug){
2963
 
    if(signal_received){
2964
 
      fprintf_plus(stderr, "%s exiting due to signal %d: %s\n",
2965
 
                   argv[0], signal_received,
2966
 
                   strsignal(signal_received));
2967
 
    } else {
2968
 
      fprintf_plus(stderr, "%s exiting\n", argv[0]);
2969
 
    }
 
2949
    fprintf_plus(stderr, "%s exiting\n", argv[0]);
2970
2950
  }
2971
2951
  
2972
2952
  /* Cleanup things */
3024
3004
      /* Take down the network interfaces which were brought up */
3025
3005
      {
3026
3006
        char *interface = NULL;
3027
 
        while((interface = argz_next(interfaces_to_take_down,
3028
 
                                     interfaces_to_take_down_size,
3029
 
                                     interface))){
 
3007
        while((interface=argz_next(interfaces_to_take_down,
 
3008
                                   interfaces_to_take_down_size,
 
3009
                                   interface))){
3030
3010
          ret = take_down_interface(interface);
3031
3011
          if(ret != 0){
3032
3012
            errno = ret;