Avoid a server-side problem with -e is at the start of the short options.
[rsync/rsync.git] / options.c
index 4bb2ab3..73187a0 100644 (file)
--- a/options.c
+++ b/options.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
  * Copyright (C) 2000, 2001, 2002 Martin Pool <mbp@samba.org>
- * Copyright (C) 2002-2008 Wayne Davison
+ * Copyright (C) 2002-2009 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -228,7 +228,8 @@ static void print_rsync_version(enum logcode f)
        STRUCT_STAT *dumstat;
 
 #if SUBPROTOCOL_VERSION != 0
-       asprintf(&subprotocol, ".PR%d", SUBPROTOCOL_VERSION);
+       if (asprintf(&subprotocol, ".PR%d", SUBPROTOCOL_VERSION) < 0)
+               out_of_memory("print_rsync_version");
 #endif
 #ifdef HAVE_SOCKETPAIR
        got_socketpair = "";
@@ -260,7 +261,7 @@ static void print_rsync_version(enum logcode f)
 
        rprintf(f, "%s  version %s  protocol version %d%s\n",
                RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol);
-       rprintf(f, "Copyright (C) 1996-2008 by Andrew Tridgell, Wayne Davison, and others.\n");
+       rprintf(f, "Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.\n");
        rprintf(f, "Web site: http://rsync.samba.org/\n");
        rprintf(f, "Capabilities:\n");
        rprintf(f, "    %d-bit files, %d-bit inums, %d-bit timestamps, %d-bit long ints,\n",
@@ -1827,12 +1828,21 @@ void server_options(char **args, int *argc_p)
                        argstr[x++] = 'i';
 #if defined HAVE_LUTIMES && defined HAVE_UTIMES
                argstr[x++] = 'L';
+#endif
+#ifdef ICONV_OPTION
+               argstr[x++] = 's';
 #endif
        }
 
+       if (x >= (int)sizeof argstr) { /* Not possible... */
+               rprintf(FERROR, "argstr overflow in server_options().\n");
+               exit_cleanup(RERR_MALLOC);
+       }
+
        argstr[x] = '\0';
 
-       args[ac++] = argstr;
+       if (x > 1)
+               args[ac++] = argstr;
 
 #ifdef ICONV_OPTION
        if (iconv_opt) {
@@ -2053,6 +2063,11 @@ void server_options(char **args, int *argc_p)
        else if (remove_source_files)
                args[ac++] = "--remove-sent-files";
 
+       if (ac > MAX_SERVER_ARGS) { /* Not possible... */
+               rprintf(FERROR, "argc overflow in server_options().\n");
+               exit_cleanup(RERR_MALLOC);
+       }
+
        *argc_p = ac;
        return;