From fa81b462e9926b05d3fa37a15c41500711740fb7 Mon Sep 17 00:00:00 2001 From: nalin Date: Jan 08 2008 23:14:50 +0000 Subject: * src/util.c: add oddjob_freestrv(). * src/autogen.maint: don't disable optimization. * src/mainloop.c,src/oddjobd.c,src/oddjob_dbus.c,src/oddjob_request.c, src/pam_oddjob_mkhomedir.c,src/pam_oddjob_mounthomedir.c: correct some compiler warnings. --- diff --git a/ChangeLog b/ChangeLog index 23281dd..e505fd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,11 @@ 2008-01-08 nalin + * src/util.c: add oddjob_freestrv(). + * src/autogen.maint: don't disable optimization. + * src/mainloop.c,src/oddjobd.c,src/oddjob_dbus.c,src/oddjob_request.c, + src/pam_oddjob_mkhomedir.c,src/pam_oddjob_mounthomedir.c: correct + some compiler warnings. + +2008-01-08 nalin * configure.ac: docbook 4.5, generate the sample PolicyKit policy, define an automake conditional for PolicyKit support * src/oddjobd.c: actually revoke one-shots for 'list' methods diff --git a/autogen.maint b/autogen.maint index 19db23a..2192183 100755 --- a/autogen.maint +++ b/autogen.maint @@ -4,4 +4,4 @@ case `uname -i` in x86_64|sparc64|s390x) lib=lib64;; *) lib=lib;; esac -env CFLAGS="`rpm --eval '%{optflags}'` -DDBUS_DISABLE_DEPRECATED -O0 -g3 -Wall -Wextra" ./configure --prefix=/usr --libdir=/usr/$lib --sysconfdir=/etc --enable-maintainer-mode --enable-xml-docs --enable-experimental "$@" +env CFLAGS="`rpm --eval '%{optflags}'` -DDBUS_DISABLE_DEPRECATED -g3 -Wall -Wextra" ./configure --prefix=/usr --libdir=/usr/$lib --sysconfdir=/etc --enable-maintainer-mode --enable-xml-docs --enable-experimental "$@" diff --git a/src/mainloop.c b/src/mainloop.c index 7ac4161..de2d2e3 100644 --- a/src/mainloop.c +++ b/src/mainloop.c @@ -1,5 +1,5 @@ /* - Copyright 2005,2006,2007 Red Hat, Inc. + Copyright 2005,2006,2007,2008 Red Hat, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -38,12 +38,13 @@ #include #include #include +#include #include #include "common.h" #include "mainloop.h" #include "util.h" -#ident "$Id: mainloop.c,v 1.12 2007/09/05 21:18:48 nalin Exp $" +#ident "$Id: mainloop.c,v 1.12.2.1 2008/01/08 23:14:50 nalin Exp $" /* Our partial approximation of a main loop, for use by D-Bus. It's enough * for our purposes, at least. */ @@ -430,10 +431,9 @@ handle(fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *unused_tv) } } if (i >= dwatch_count) { - oddjob_resize_array((void **)&dwatches, - sizeof(dwatches[0]), - dwatch_count, - i + 1); + resize_array(&dwatches, + dwatch_count, + i + 1); dwatches[i].watch = dwatch; dwatches[i].flags = flags; dwatch_count = i + 1; diff --git a/src/oddjob_dbus.c b/src/oddjob_dbus.c index e7b9a0f..7250e28 100644 --- a/src/oddjob_dbus.c +++ b/src/oddjob_dbus.c @@ -400,10 +400,9 @@ oddjob_dbus_message_from_message(DBusConnection *conn, while (more) { switch (dbus_message_iter_get_arg_type(&iter)) { case DBUS_TYPE_STRING: - oddjob_resize_array((void**) &msg->args, - sizeof(char*), - msg->n_args, - msg->n_args + 1); + resize_array(&msg->args, + msg->n_args, + msg->n_args + 1); #if DBUS_CHECK_VERSION(0,30,0) dbus_message_iter_get_basic(&iter, &p); msg->args[msg->n_args] = oddjob_strdup(p); @@ -462,8 +461,7 @@ oddjob_dbus_message_dup(struct oddjob_dbus_message *input) msg->result = input->result; msg->n_args = input->n_args; msg->args = NULL; - oddjob_resize_array((void **) &msg->args, sizeof(char *), - 0, msg->n_args); + resize_array(&msg->args, 0, msg->n_args); for (i = 0; i < msg->n_args; i++) { msg->args[i] = oddjob_strdup(input->args[i]); } @@ -488,7 +486,7 @@ oddjob_dbus_message_free(struct oddjob_dbus_message *msg) } msg->args = NULL; msg->n_args = 0; - oddjob_freev(msg->pk_could_allows); + oddjob_freestrv(msg->pk_could_allows); msg->result = -1; if (msg->msg != NULL) { dbus_message_unref(msg->msg); @@ -839,9 +837,7 @@ oddjob_dbus_listener_add_method(struct oddjob_dbus_context *ctx, "\"%s\"!\n", service_name); return FALSE; } - oddjob_resize_array((void**)&ctx->services, - sizeof(ctx->services[0]), - ctx->n_services, i + 1); + resize_array(&ctx->services, ctx->n_services, i + 1); ctx->services[i].name = oddjob_strdup(service_name); ctx->services[i].objects = NULL; ctx->services[i].n_objects = 0; @@ -857,9 +853,7 @@ oddjob_dbus_listener_add_method(struct oddjob_dbus_context *ctx, } } if (i >= srv->n_objects) { - oddjob_resize_array((void**)&srv->objects, - sizeof(srv->objects[0]), - srv->n_objects, i + 1); + resize_array(&srv->objects, srv->n_objects, i + 1); srv->objects[i].path = oddjob_strdup(object_path); srv->objects[i].interfaces = NULL; srv->objects[i].n_interfaces = 0; @@ -875,9 +869,7 @@ oddjob_dbus_listener_add_method(struct oddjob_dbus_context *ctx, } } if (i >= obj->n_interfaces) { - oddjob_resize_array((void**)&obj->interfaces, - sizeof(obj->interfaces[0]), - obj->n_interfaces, i + 1); + resize_array(&obj->interfaces, obj->n_interfaces, i + 1); obj->interfaces[i].interface = oddjob_strdup(interface); obj->n_interfaces = i + 1; } @@ -891,9 +883,7 @@ oddjob_dbus_listener_add_method(struct oddjob_dbus_context *ctx, } } if (i >= interf->n_methods) { - oddjob_resize_array((void**)&interf->methods, - sizeof(interf->methods[0]), - interf->n_methods, i + 1); + resize_array(&interf->methods, interf->n_methods, i + 1); interf->methods[i].method = oddjob_strdup(method); interf->n_methods = i + 1; } @@ -997,14 +987,11 @@ oddjob_dbus_listener_remove_method(struct oddjob_dbus_context *ctx, break; } } - oddjob_resize_array((void**)&interf->methods, - sizeof(interf->methods[0]), - interf->n_methods, interf->n_methods - 1); + resize_array(&interf->methods, + interf->n_methods, interf->n_methods - 1); interf->n_methods--; } else { - oddjob_resize_array((void**)&interf->methods, - sizeof(interf->methods[0]), - interf->n_methods, 0); + resize_array(&interf->methods, interf->n_methods, 0); interf->n_methods = 0; } @@ -1026,14 +1013,11 @@ oddjob_dbus_listener_remove_method(struct oddjob_dbus_context *ctx, break; } } - oddjob_resize_array((void**)&obj->interfaces, - sizeof(obj->interfaces[0]), - obj->n_interfaces, obj->n_interfaces - 1); + resize_array(&obj->interfaces, + obj->n_interfaces, obj->n_interfaces - 1); obj->n_interfaces--; } else { - oddjob_resize_array((void**)&obj->interfaces, - sizeof(obj->interfaces[0]), - obj->n_interfaces, 0); + resize_array(&obj->interfaces, obj->n_interfaces, 0); obj->n_interfaces = 0; } @@ -1055,14 +1039,10 @@ oddjob_dbus_listener_remove_method(struct oddjob_dbus_context *ctx, break; } } - oddjob_resize_array((void**)&srv->objects, - sizeof(srv->objects[0]), - srv->n_objects, srv->n_objects - 1); + resize_array(&srv->objects, srv->n_objects, srv->n_objects - 1); srv->n_objects--; } else { - oddjob_resize_array((void**)&srv->objects, - sizeof(srv->objects[0]), - srv->n_objects, 0); + resize_array(&srv->objects, srv->n_objects, 0); srv->n_objects = 0; } @@ -1085,14 +1065,11 @@ oddjob_dbus_listener_remove_method(struct oddjob_dbus_context *ctx, break; } } - oddjob_resize_array((void**)&ctx->services, - sizeof(ctx->services[0]), - srv->n_objects, srv->n_objects - 1); + resize_array(&ctx->services, + srv->n_objects, srv->n_objects - 1); srv->n_objects--; } else { - oddjob_resize_array((void**)&ctx->services, - sizeof(ctx->services[0]), - srv->n_objects, 0); + resize_array(&ctx->services, srv->n_objects, 0); ctx->n_services = 0; } @@ -1305,6 +1282,7 @@ oddjob_dbus_call_methodv_with_actions(DBusBusType bus, struct oddjob_dbus_message *msg; int ret, i; const char *p; + void *q; char **actions; if (output != NULL) { @@ -1348,6 +1326,8 @@ oddjob_dbus_call_methodv_with_actions(DBusBusType bus, dbus_pending_call_block(pending_call); reply = dbus_pending_call_steal_reply(pending_call); dbus_pending_call_unref(pending_call); + } else { + reply = NULL; } dbus_set_error_from_message(&err, reply); @@ -1405,11 +1385,10 @@ oddjob_dbus_call_methodv_with_actions(DBusBusType bus, dbus_message_iter_recurse(&subiter, &subsubiter); while (dbus_message_iter_get_arg_type(&subsubiter) == DBUS_TYPE_STRING) { dbus_message_iter_get_basic(&subsubiter, - (void**)&p); - oddjob_resize_array((void **) &actions, - sizeof(void *), - i, i + 2); - actions[i++] = oddjob_strdup(p); + &q); + resize_array(&actions, + i, i + 2); + actions[i++] = oddjob_strdup(q); actions[i] = NULL; if (!dbus_message_iter_next(&subsubiter)) { break; @@ -1473,7 +1452,7 @@ oddjob_dbus_call_method(DBusBusType bus, i = 0; va_start(ap, error_length); while ((p = va_arg(ap, char*)) != NULL) { - oddjob_resize_array((void **) &argv, sizeof(char*), i, i + 2); + resize_array(&argv, i, i + 2); argv[i] = p; i++; } @@ -1601,10 +1580,7 @@ oddjob_dbus_message_sender_has_polkit_action(struct oddjob_dbus_message *msg, n_elts++) { continue; } - oddjob_resize_array((void **) &msg->pk_could_allows, - sizeof(char *), - n_elts, - n_elts + 3); + resize_array(&msg->pk_could_allows, n_elts, n_elts + 3); msg->pk_could_allows[n_elts] = oddjob_strdup(pk_action); n_elts++; msg->pk_could_allows[n_elts] = oddjob_strdup(polkit_result_to_string_representation(pk_result)); diff --git a/src/oddjob_request.c b/src/oddjob_request.c index 2d73a2b..0fbb0e8 100644 --- a/src/oddjob_request.c +++ b/src/oddjob_request.c @@ -39,9 +39,10 @@ #include #include "common.h" #include "oddjob.h" +#include "util.h" #define EXPECTED_ERROR "org.freedesktop.DBus.Error.ServiceUnknown" -#ident "$Id: oddjob_request.c,v 1.13.2.1 2008/01/08 22:13:46 nalin Exp $" +#ident "$Id: oddjob_request.c,v 1.13.2.2 2008/01/08 23:14:50 nalin Exp $" int main(int argc, char **argv) diff --git a/src/oddjobd.c b/src/oddjobd.c index 895c5c9..e5eae3c 100644 --- a/src/oddjobd.c +++ b/src/oddjobd.c @@ -60,7 +60,7 @@ #include "oddjob_dbus.h" #include "util.h" -#ident "$Id: oddjobd.c,v 1.46.2.5 2008/01/08 22:12:39 nalin Exp $" +#ident "$Id: oddjobd.c,v 1.46.2.6 2008/01/08 23:14:50 nalin Exp $" #define ODDJOB_INTROSPECTION_HEADER \ "methods, - sizeof(interface->methods[0]), - interface->n_methods, - interface->n_methods + 1); + resize_array(&interface->methods, + interface->n_methods, interface->n_methods + 1); method = &interface->methods[interface->n_methods]; method->name = oddjob_strdup(name); method->acl = NULL; @@ -1043,10 +1041,8 @@ static struct interface * interface_add(struct object *object, const char *name) { struct interface *interface; - oddjob_resize_array((void **) &object->interfaces, - sizeof(object->interfaces[0]), - object->n_interfaces, - object->n_interfaces + 1); + resize_array(&object->interfaces, + object->n_interfaces, object->n_interfaces + 1); interface = &object->interfaces[object->n_interfaces]; interface->name = oddjob_strdup(name); interface->methods = NULL; @@ -1136,10 +1132,8 @@ static struct object * object_add(struct service *service, const char *name) { struct object *object; - oddjob_resize_array((void **) &service->objects, - sizeof(service->objects[0]), - service->n_objects, - service->n_objects + 1); + resize_array(&service->objects, + service->n_objects, service->n_objects + 1); object = &service->objects[service->n_objects]; object->name = oddjob_strdup(name); object->interfaces = NULL; @@ -1229,10 +1223,8 @@ static struct service * service_add(struct oddjob_config *config, const char *name) { struct service *service; - oddjob_resize_array((void **) &config->services, - sizeof(config->services[0]), - config->n_services, - config->n_services + 1); + resize_array(&config->services, + config->n_services, config->n_services + 1); service = &config->services[config->n_services]; service->name = oddjob_strdup(name); service->config = config; diff --git a/src/pam_oddjob_mkhomedir.c b/src/pam_oddjob_mkhomedir.c index df176c6..ee3c480 100644 --- a/src/pam_oddjob_mkhomedir.c +++ b/src/pam_oddjob_mkhomedir.c @@ -39,7 +39,17 @@ #include "common.h" #include "oddjob_dbus.h" -#ident "$Id: pam_oddjob_mkhomedir.c,v 1.8 2007/09/05 21:16:13 nalin Exp $" +#ident "$Id: pam_oddjob_mkhomedir.c,v 1.8.2.1 2008/01/08 23:14:50 nalin Exp $" + +static int +get_conv_item(pam_handle_t *pamh, struct pam_conv **conv) +{ + void *p; + int i; + i = pam_get_item(pamh, PAM_CONV, (const void **) &p); + *conv = p; + return i; +} static void conv_text_info(pam_handle_t *pamh, const char *info) @@ -47,7 +57,7 @@ conv_text_info(pam_handle_t *pamh, const char *info) struct pam_conv *conv; int i; conv = NULL; - if ((pam_get_item(pamh, PAM_CONV, (const void**) &conv) == PAM_SUCCESS) && + if ((get_conv_item(pamh, &conv) == PAM_SUCCESS) && (conv != NULL)) { const struct pam_message message = { .msg_style = PAM_TEXT_INFO, diff --git a/src/pam_oddjob_mounthomedir.c b/src/pam_oddjob_mounthomedir.c index b1f52bf..e910611 100644 --- a/src/pam_oddjob_mounthomedir.c +++ b/src/pam_oddjob_mounthomedir.c @@ -1,5 +1,5 @@ /* - Copyright 2005 Red Hat, Inc. + Copyright 2005,2008 Red Hat, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -39,7 +39,27 @@ #include "common.h" #include "oddjob_dbus.h" -#ident "$Id: pam_oddjob_mounthomedir.c,v 1.6 2005/12/21 23:20:15 nalin Exp $" +#ident "$Id: pam_oddjob_mounthomedir.c,v 1.6.2.1 2008/01/08 23:14:50 nalin Exp $" + +static int +get_conv_item(pam_handle_t *pamh, struct pam_conv **conv) +{ + void *p; + int i; + i = pam_get_item(pamh, PAM_CONV, (const void **) &p); + *conv = p; + return i; +} + +static int +get_text_item(pam_handle_t *pamh, int item, const char **text) +{ + void *p; + int i; + i = pam_get_item(pamh, item, (const void **) &p); + *text = p; + return i; +} static void conv_text_info(pam_handle_t *pamh, const char *info) @@ -47,7 +67,7 @@ conv_text_info(pam_handle_t *pamh, const char *info) struct pam_conv *conv; int i; conv = NULL; - if ((pam_get_item(pamh, PAM_CONV, (const void**) &conv) == PAM_SUCCESS) && + if ((get_conv_item(pamh, &conv) == PAM_SUCCESS) && (conv != NULL)) { const struct pam_message message = { .msg_style = PAM_TEXT_INFO, @@ -113,8 +133,7 @@ send_pam_oddjob_mounthomedir_request(pam_handle_t *pamh, const char *action) * FIXME: this is WRONG WRONG WRONG -- if the user * didn't use a password, we're so screwed. In fact, * don't use this module. Ever. */ - ret = pam_get_item(pamh, PAM_AUTHTOK, - (const void**) &authtok); + ret = get_text_item(pamh, PAM_AUTHTOK, &authtok); if ((ret != PAM_SUCCESS) || (authtok == NULL)) { authtok = ""; } diff --git a/src/util.c b/src/util.c index e9b3b11..6ba9ee3 100644 --- a/src/util.c +++ b/src/util.c @@ -1,5 +1,5 @@ /* - Copyright 2005 Red Hat, Inc. + Copyright 2005,2008 Red Hat, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -36,6 +36,7 @@ #include #include #include +#include "util.h" /* Write to a file, handling transient errors. */ ssize_t @@ -103,6 +104,16 @@ oddjob_freev(void **p) oddjob_free(p); } +void +oddjob_freestrv(char **p) +{ + int i; + for (i = 0; (p != NULL) && (p[i] != NULL); i++) { + oddjob_free(p[i]); + } + oddjob_free(p); +} + char * oddjob_strdup(const char *s) { @@ -166,7 +177,7 @@ oddjob_resize_array(void **array, size_t element_size, current_n_elements : want_n_elements; if (save_n_elements > 0) { memmove(p, *array, element_size * save_n_elements); - memset(*array, 0, element_size * save_n_elements); + memset(*array, 0, element_size * current_n_elements); } oddjob_free(*array); *array = p; @@ -175,7 +186,8 @@ oddjob_resize_array(void **array, size_t element_size, char ** oddjob_collect_args(FILE *fp) { - char **ret, *thisline, *p; + char **ret; + char *thisline, *p; char buf[BUFSIZ]; size_t l, m, arraysize; @@ -197,19 +209,15 @@ oddjob_collect_args(FILE *fp) p = strpbrk(thisline, "\r\n"); if (p != NULL) { *p = '\0'; - oddjob_resize_array((void**) &ret, sizeof(char*), - arraysize, - arraysize + 2); + resize_array(&ret, arraysize, arraysize + 2); ret[arraysize] = thisline; arraysize++; thisline = NULL; } } if (thisline != NULL) { - oddjob_resize_array((void**) &ret, sizeof(char*), - arraysize, - arraysize ? - arraysize + 1 : arraysize + 2); + resize_array(&ret, arraysize, + arraysize ? arraysize + 1 : arraysize + 2); ret[arraysize] = thisline; arraysize = arraysize ? arraysize + 1 : arraysize + 2; thisline = NULL; diff --git a/src/util.h b/src/util.h index f204efe..bad31d9 100644 --- a/src/util.h +++ b/src/util.h @@ -1,5 +1,5 @@ /* - Copyright 2005 Red Hat, Inc. + Copyright 2005,2008 Red Hat, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -31,17 +31,41 @@ #ifndef oddjob_util_h #define oddjob_util_h +#define resize_array(_arrayp, _n_elts, _new_n_elts) \ + { \ + void *_p; \ + size_t _eltsize = sizeof((_arrayp)[0]), _save_n_elts; \ + if (_new_n_elts > 0xffff) { \ + fprintf(stderr, "Internal limit exceeded.\n"); \ + _exit(1); \ + } \ + if (_eltsize > 0xffff) { \ + fprintf(stderr, "Internal limit exceeded.\n"); \ + _exit(1); \ + } \ + _p = NULL; \ + if ((_eltsize > 0) && (_new_n_elts > 0)) { \ + _p = oddjob_malloc0(_eltsize * _new_n_elts); \ + } \ + _save_n_elts = (_n_elts < _new_n_elts) ? _n_elts : _new_n_elts;\ + if (_save_n_elts > 0) { \ + memmove(_p, *(_arrayp), _eltsize * _save_n_elts); \ + memset(*(_arrayp), 0, _eltsize * _n_elts); \ + } \ + oddjob_free(*(_arrayp)); \ + *(_arrayp) = _p; \ + } ssize_t retry_write(int fd, unsigned char *buf, size_t length); void *oddjob_malloc(size_t size); void *oddjob_malloc0(size_t size); void oddjob_free(void *p); -void oddjob_freev(void *p); +void oddjob_freev(void **p); +void oddjob_freestrv(char **p); char *oddjob_strdup(const char *s); char *oddjob_strdup_printf(const char *s, ...); char *oddjob_strndup(const char *s, int n); void oddjob_resize_array(void **array, size_t element_size, size_t current_n_elements, size_t want_n_elements); - char **oddjob_collect_args(FILE *fp); char **oddjob_parse_args(const char *cmdline, const char **error); void oddjob_free_args(char **args);