diff options
author | Derrell Lipman <derrell@samba.org> | 2006-06-27 02:30:58 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:18:59 -0500 |
commit | 9718506d35ca14c5233b613c647609bf2589f38b (patch) | |
tree | 49ce9dccfaeb36d4253b30d9dc870bd9ebd703d4 /source3 | |
parent | ad6f4f14ad10dab330e51ad36f8f8d6ccc065be2 (diff) | |
download | samba-9718506d35ca14c5233b613c647609bf2589f38b.tar.gz samba-9718506d35ca14c5233b613c647609bf2589f38b.tar.bz2 samba-9718506d35ca14c5233b613c647609bf2589f38b.zip |
r16550: Fix bug 3866. Thanks for the report!
Although I've never met a computer or compiler that produced pointers to
functions which are a different size than pointers to data, I suppose they
probably exist. Assigning a pointer to a function is technically illegal in C
anyway.
Change casts of the option_value based on the option_name to use of variable
argument lists.
For binary compatibility, I've maintained but deprecated the old behavior of
debug_stderr (which expected to be passed a NULL or non-NULL pointer) and
added a new option debug_to_stderr which properly expects a boolean (int)
parameter.
Derrell
(This used to be commit c1b4c510530ca3118d1eccb9615a8cad732c7373)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/libsmbclient.h | 2 | ||||
-rw-r--r-- | source3/libsmb/libsmbclient.c | 47 |
2 files changed, 42 insertions, 7 deletions
diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h index ba92259f70..66a567a0d5 100644 --- a/source3/include/libsmbclient.h +++ b/source3/include/libsmbclient.h @@ -635,7 +635,7 @@ int smbc_free_context(SMBCCTX * context, int shutdown_ctx); void smbc_option_set(SMBCCTX *context, char *option_name, - void *option_value); + ... /* option_value */); /* * Retrieve the current value of an option * diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c index 98264dfa86..7f41103e4f 100644 --- a/source3/libsmb/libsmbclient.c +++ b/source3/libsmb/libsmbclient.c @@ -236,7 +236,7 @@ smbc_urlencode(char * dest, char * src, int max_dest_len) * * * We accept: - * smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]][?options] + * smb://[[[domain;]user[:password]@]server[/share[/path[/file]]]][?options] * * Meaning of URLs: * @@ -6003,27 +6003,62 @@ smbc_free_context(SMBCCTX *context, void smbc_option_set(SMBCCTX *context, char *option_name, - void *option_value) + ... /* option_value */) { - if (strcmp(option_name, "debug_stderr") == 0) { + va_list ap; + union { + BOOL b; + smbc_get_auth_data_with_context_fn auth_fn; + void *v; + } option_value; + + va_start(ap, option_name); + + if (strcmp(option_name, "debug_to_stderr") == 0) { /* * Log to standard error instead of standard output. */ + option_value.b = (BOOL) va_arg(ap, int); + context->internal->_debug_stderr = option_value.b; + + } else if (strcmp(option_name, "debug_to_stderr") == 0) { + /* + * Log to standard error instead of standard output. + * + * This function used to take a third parameter, + * void *option_value. Since it was a void* and we needed to + * pass a boolean, a boolean value was cast to void* to be + * passed in. Now that we're using a va_list to retrieve the + * parameters, the casting kludge is unnecessary. + * + * WARNING: DO NOT USE THIS OPTION. + * This option is retained for backward compatibility. New + * applications should use "debug_to_stderr" and properly pass + * in a boolean (int) value. + */ + option_value.v = va_arg(ap, void *); context->internal->_debug_stderr = - (option_value == NULL ? False : True); + (option_value.v == NULL ? False : True); + } else if (strcmp(option_name, "auth_function") == 0) { /* * Use the new-style authentication function which includes * the context. */ - context->internal->_auth_fn_with_context = option_value; + option_value.auth_fn = + va_arg(ap, smbc_get_auth_data_with_context_fn); + context->internal->_auth_fn_with_context = + option_value.auth_fn; } else if (strcmp(option_name, "user_data") == 0) { /* * Save a user data handle which may be retrieved by the user * with smbc_option_get() */ - context->internal->_user_data = option_value; + option_value.v = va_arg(ap, void *); + context->internal->_user_data = option_value.v; } + + va_end(ap); } |