The branch, master has been updated
       via  a5495bc Remove smb_panic() from unix_strlower(). Just rely on error 
code return.
       via  b70f23c Correctly check for errors in strlower_m() returns.
       via  ce21d08 Fix strlower_m() to return an error indication.
       via  c13887d Check error returns on strnorm().
       via  526e875 Check error returns from strupper_m() (in all reasonable 
places).
       via  e1ec86a Fix missing ads_destroy in error path.
       via  9fcc6f2 Change strupper_m() to return a value.
       via  af3e529 Fix bad return in unix_strupper.
       via  b6eb3a6 Prepare to remove smb_panic() from unix_strlower().
       via  8605b35 Fix bad return values in unix_strlower/unix_strupper.
      from  f64c970 s4:torture:basic: check the return status of the last open 
in deltest16

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a5495bc6b073d29041d9a8e229d37693d6a0c513
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 17:32:50 2012 -0700

    Remove smb_panic() from unix_strlower(). Just rely on error code return.
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu Aug  9 23:52:53 CEST 2012 on sn-devel-104

commit b70f23c2b581c5d455362ab37f4846de9a910055
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 17:01:00 2012 -0700

    Correctly check for errors in strlower_m() returns.

commit ce21d0804012da27cec72abe896352d7f0e7e1e5
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 15:56:58 2012 -0700

    Fix strlower_m() to return an error indication.

commit c13887defc4c05b6b87f8f40ae0cf981a497f443
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 15:49:34 2012 -0700

    Check error returns on strnorm().

commit 526e875cec15761099438e17df3f56bc2bd5b761
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 15:35:28 2012 -0700

    Check error returns from strupper_m() (in all reasonable places).

commit e1ec86a49ce1d7c3ebe99fc175ffad70a03c4a0b
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 15:21:33 2012 -0700

    Fix missing ads_destroy in error path.

commit 9fcc6f27fb2cf8cf5c30b701cb6788fc8f70cf82
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 12:16:40 2012 -0700

    Change strupper_m() to return a value.

commit af3e529c18dae94d10b617eb8377e2ab64d34982
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 12:10:01 2012 -0700

    Fix bad return in unix_strupper.

commit b6eb3a68088a20fba4819064699abdddfd594a4d
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 12:07:54 2012 -0700

    Prepare to remove smb_panic() from unix_strlower().

commit 8605b35e8824bf30633d47333df3720f9ff4dbaa
Author: Jeremy Allison <[email protected]>
Date:   Wed Aug 8 12:06:34 2012 -0700

    Fix bad return values in unix_strlower/unix_strupper.

-----------------------------------------------------------------------

Summary of changes:
 libgpo/gpext/gpext.c                        |    4 ++-
 source3/auth/auth_builtin.c                 |    8 +++-
 source3/auth/auth_util.c                    |    4 ++-
 source3/auth/pampass.c                      |    4 +-
 source3/auth/pass_check.c                   |    8 +++-
 source3/auth/user_util.c                    |    4 ++-
 source3/client/client.c                     |    9 ++++-
 source3/client/clitar.c                     |    2 +-
 source3/include/proto.h                     |    6 ++--
 source3/lib/afs.c                           |    4 ++-
 source3/lib/charcnv.c                       |    5 ++-
 source3/lib/substitute.c                    |   15 ++++++--
 source3/lib/username.c                      |   16 +++++++--
 source3/lib/util.c                          |   10 ++++-
 source3/lib/util_names.c                    |    3 +-
 source3/lib/util_str.c                      |   52 +++++++++++++++++---------
 source3/libads/ads_struct.c                 |    6 +++-
 source3/libads/kerberos.c                   |    6 ++-
 source3/libads/kerberos_keytab.c            |    5 ++-
 source3/libads/ldap.c                       |   33 ++++++++++++++---
 source3/libads/sasl.c                       |   27 ++++++++++++--
 source3/libnet/libnet_join.c                |   27 +++++++++++---
 source3/librpc/crypto/gse_krb5.c            |    5 ++-
 source3/libsmb/cliconnect.c                 |    4 ++-
 source3/libsmb/clirap.c                     |    8 +++-
 source3/libsmb/clirap2.c                    |    8 +++-
 source3/libsmb/namequery_dc.c               |    6 +++-
 source3/libsmb/nmblib.c                     |    6 ++-
 source3/modules/vfs_afsacl.c                |    4 ++-
 source3/modules/vfs_prealloc.c              |    4 ++-
 source3/modules/vfs_streams_depot.c         |    5 ++-
 source3/modules/vfs_streams_xattr.c         |    4 ++-
 source3/nmbd/nmbd_browserdb.c               |   10 ++++-
 source3/nmbd/nmbd_browsesync.c              |    5 ++-
 source3/nmbd/nmbd_elections.c               |    5 ++-
 source3/nmbd/nmbd_incomingdgrams.c          |    5 ++-
 source3/nmbd/nmbd_incomingrequests.c        |    5 ++-
 source3/nmbd/nmbd_namelistdb.c              |   21 ++++++++---
 source3/nmbd/nmbd_sendannounce.c            |   10 ++++-
 source3/nmbd/nmbd_serverlistdb.c            |    6 +++-
 source3/nmbd/nmbd_winsserver.c              |    2 +-
 source3/param/loadparm.c                    |    5 ++-
 source3/param/service.c                     |    4 ++-
 source3/passdb/lookup_sid.c                 |    5 ++-
 source3/passdb/machine_account_secrets.c    |    8 +++-
 source3/passdb/pdb_interface.c              |    8 +++-
 source3/passdb/pdb_ipa.c                    |    4 ++-
 source3/passdb/pdb_ldap.c                   |    9 ++++-
 source3/passdb/pdb_tdb.c                    |   28 +++++++++++----
 source3/printing/lpq_parse.c                |    4 ++-
 source3/printing/nt_printing_tdb.c          |    4 +-
 source3/registry/reg_backend_db.c           |    4 ++-
 source3/registry/reg_util_internal.c        |    5 ++-
 source3/rpc_server/dfs/srv_dfs_nt.c         |    4 ++-
 source3/rpc_server/dssetup/srv_dssetup_nt.c |    4 ++-
 source3/smbd/filename.c                     |   15 ++++++--
 source3/smbd/lanman.c                       |   14 +++++--
 source3/smbd/mangle_hash.c                  |    5 ++-
 source3/smbd/mangle_hash2.c                 |    2 +-
 source3/smbd/negprot.c                      |    2 +-
 source3/smbd/service.c                      |   11 +++++-
 source3/smbd/smb2_tcon.c                    |    5 ++-
 source3/torture/masktest.c                  |    4 +-
 source3/torture/torture.c                   |    2 +-
 source3/utils/net_ads.c                     |   20 ++++++++--
 source3/utils/net_idmap.c                   |    6 +++-
 source3/utils/net_registry_check.c          |   10 ++++-
 source3/utils/net_rpc.c                     |   38 ++++++++++++++++----
 source3/utils/net_rpc_join.c                |   10 ++++-
 source3/utils/net_usershare.c               |    8 +++-
 source3/utils/ntlm_auth.c                   |    4 +--
 source3/utils/pdbedit.c                     |   11 +++++-
 source3/utils/smbcontrol.c                  |    2 +-
 source3/utils/smbpasswd.c                   |    6 +++-
 source3/winbindd/idmap_ldap.c               |    7 +++-
 source3/winbindd/wb_fill_pwent.c            |    5 ++-
 source3/winbindd/winbindd_ads.c             |   10 ++++-
 source3/winbindd/winbindd_cache.c           |   22 ++++++++----
 source3/winbindd/winbindd_cm.c              |    5 ++-
 source3/winbindd/winbindd_pam.c             |   12 +++++--
 source3/winbindd/winbindd_util.c            |   11 +++---
 81 files changed, 546 insertions(+), 178 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libgpo/gpext/gpext.c b/libgpo/gpext/gpext.c
index 8bda729..df84475 100644
--- a/libgpo/gpext/gpext.c
+++ b/libgpo/gpext/gpext.c
@@ -440,7 +440,9 @@ static WERROR gp_extension_store_reg_entry(TALLOC_CTX 
*mem_ctx,
        subkeyname = GUID_string2(mem_ctx, &entry->guid);
        W_ERROR_HAVE_NO_MEMORY(subkeyname);
 
-       strupper_m(discard_const_p(char, subkeyname));
+       if (!strupper_m(discard_const_p(char, subkeyname))) {
+               return WERR_INVALID_PARAM;
+       }
 
        werr = gp_store_reg_subkey(mem_ctx,
                                   subkeyname,
diff --git a/source3/auth/auth_builtin.c b/source3/auth/auth_builtin.c
index b757894..dce58bf 100644
--- a/source3/auth/auth_builtin.c
+++ b/source3/auth/auth_builtin.c
@@ -97,11 +97,15 @@ static NTSTATUS check_name_to_ntstatus_security(const 
struct auth_context *auth_
        fstrcpy(user, user_info->client.account_name);
 
        if (strnequal("NT_STATUS", user, strlen("NT_STATUS"))) {
-               strupper_m(user);
+               if (!strupper_m(user)) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
                return nt_status_string_to_code(user);
        }
 
-       strlower_m(user);
+       if (!strlower_m(user)) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
        error_num = strtoul(user, NULL, 16);
 
        DEBUG(5,("check_name_to_ntstatus_security: Error for user %s was 
%lx\n", user, error_num));
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c
index 28d934a..a08d094 100644
--- a/source3/auth/auth_util.c
+++ b/source3/auth/auth_util.c
@@ -1252,7 +1252,9 @@ static NTSTATUS check_account(TALLOC_CTX *mem_ctx, const 
char *domain,
        if (!lower_username) {
                return NT_STATUS_NO_MEMORY;
        }
-       strlower_m( lower_username );
+       if (!strlower_m( lower_username )) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
        orig_dom_user = talloc_asprintf(mem_ctx,
                                "%s%c%s",
diff --git a/source3/auth/pampass.c b/source3/auth/pampass.c
index 87fa8ca..427c22a 100644
--- a/source3/auth/pampass.c
+++ b/source3/auth/pampass.c
@@ -249,7 +249,7 @@ static struct chat_struct *make_pw_chat(const char *p)
 
                special_char_sub(prompt);
                fstrcpy(t->prompt, prompt);
-               strlower_m(t->prompt);
+               (void)strlower_m(t->prompt);
                trim_char(t->prompt, ' ', ' ');
 
                if (!next_token_talloc(frame, &p, &reply, NULL)) {
@@ -262,7 +262,7 @@ static struct chat_struct *make_pw_chat(const char *p)
 
                special_char_sub(reply);
                fstrcpy(t->reply, reply);
-               strlower_m(t->reply);
+               (void)strlower_m(t->reply);
                trim_char(t->reply, ' ', ' ');
 
        }
diff --git a/source3/auth/pass_check.c b/source3/auth/pass_check.c
index ca99261..f2d1fc2 100644
--- a/source3/auth/pass_check.c
+++ b/source3/auth/pass_check.c
@@ -867,7 +867,9 @@ NTSTATUS pass_check(const struct passwd *pass,
 
        /* try all lowercase if it's currently all uppercase */
        if (strhasupper(pass2)) {
-               strlower_m(pass2);
+               if (!strlower_m(pass2)) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
                nt_status = password_check(pass2, (const void *)rhost);
                if (NT_STATUS_IS_OK(nt_status)) {
                        return (nt_status);
@@ -880,7 +882,9 @@ NTSTATUS pass_check(const struct passwd *pass,
        }
 
        /* last chance - all combinations of up to level chars upper! */
-       strlower_m(pass2);
+       if (!strlower_m(pass2)) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
        nt_status = string_combinations(pass2, password_check, level,
                                        (const void *)rhost);
diff --git a/source3/auth/user_util.c b/source3/auth/user_util.c
index 8938aeb..4842192 100644
--- a/source3/auth/user_util.c
+++ b/source3/auth/user_util.c
@@ -164,7 +164,9 @@ bool user_in_netgroup(TALLOC_CTX *ctx, const char *user, 
const char *ngname)
        if (!lowercase_user) {
                return false;
        }
-       strlower_m(lowercase_user);
+       if (!strlower_m(lowercase_user)) {
+               return false;
+       }
 
        if (strcmp(user,lowercase_user) == 0) {
                /* user name was already lower case! */
diff --git a/source3/client/client.c b/source3/client/client.c
index 28fc30a..2c949ac 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -1086,7 +1086,10 @@ static int do_get(const char *rname, const char 
*lname_in, bool reget)
        }
 
        if (lowercase) {
-               strlower_m(lname);
+               if (!strlower_m(lname)) {
+                       d_printf("strlower_m %s failed\n", lname);
+                       return 1;
+               }
        }
 
        status = cli_resolve_path(ctx, "", auth_info, cli, rname, &targetcli,
@@ -1296,7 +1299,9 @@ static NTSTATUS do_mget(struct cli_state *cli_state, 
struct file_info *finfo,
 
        string_replace(finfo->name,'\\','/');
        if (lowercase) {
-               strlower_m(finfo->name);
+               if (!strlower_m(finfo->name)) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
        }
 
        if (!directory_exist(finfo->name) &&
diff --git a/source3/client/clitar.c b/source3/client/clitar.c
index c0b6e4e..cae512b 100644
--- a/source3/client/clitar.c
+++ b/source3/client/clitar.c
@@ -173,7 +173,7 @@ static void writetarheader(int f, const char *aname, 
uint64_t size, time_t mtime
        fixtarname(hb.dbuf.name, aname, (l+2 >= NAMSIZ) ? NAMSIZ : l + 2);
 
        if (lowercase)
-               strlower_m(hb.dbuf.name);
+               (void)strlower_m(hb.dbuf.name);
 
        /* write out a "standard" tar format header */
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index ebb76ef..9af72a1 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -662,7 +662,7 @@ ssize_t tstream_read_packet_recv(struct tevent_req *req, 
TALLOC_CTX *mem_ctx,
 bool next_token(const char **ptr, char *buff, const char *sep, size_t bufsize);
 bool strnequal(const char *s1,const char *s2,size_t n);
 bool strcsequal(const char *s1,const char *s2);
-void strnorm(char *s, int case_default);
+bool strnorm(char *s, int case_default);
 char *push_skip_string(char *buf);
 char *skip_string(const char *base, size_t len, char *buf);
 size_t str_charnum(const char *s);
@@ -701,8 +701,8 @@ char *strchr_m(const char *src, char c);
 char *strrchr_m(const char *s, char c);
 char *strnrchr_m(const char *s, char c, unsigned int n);
 char *strstr_m(const char *src, const char *findstr);
-void strlower_m(char *s);
-void strupper_m(char *s);
+bool strlower_m(char *s);
+bool strupper_m(char *s);
 size_t strlen_m(const char *s);
 size_t strlen_m_term(const char *s);
 size_t strlen_m_term_null(const char *s);
diff --git a/source3/lib/afs.c b/source3/lib/afs.c
index 849e9ce..4b6e6ec 100644
--- a/source3/lib/afs.c
+++ b/source3/lib/afs.c
@@ -259,7 +259,9 @@ bool afs_login(connection_struct *conn)
 
        /* The pts command always generates completely lower-case user
         * names. */
-       strlower_m(afs_username);
+       if (!strlower_m(afs_username)) {
+               return false;
+       }
 
        cell = strchr(afs_username, '@');
 
diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c
index 5863d72..32ba97a 100644
--- a/source3/lib/charcnv.c
+++ b/source3/lib/charcnv.c
@@ -61,7 +61,10 @@ size_t push_ascii(void *dest, const char *src, size_t 
dest_len, int flags)
                if (!tmpbuf) {
                        smb_panic("malloc fail");
                }
-               strupper_m(tmpbuf);
+               if (!strupper_m(tmpbuf)) {
+                       SAFE_FREE(tmpbuf);
+                       return (size_t)-1;
+               }
                src = tmpbuf;
        }
 
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c
index 4458286..a254bca 100644
--- a/source3/lib/substitute.c
+++ b/source3/lib/substitute.c
@@ -66,7 +66,10 @@ bool set_local_machine_name(const char *local_name, bool 
perm)
        /* alpha_strcpy includes the space for the terminating nul. */
        alpha_strcpy(local_machine,tmp_local_machine,
                        SAFE_NETBIOS_CHARS,len+1);
-       strlower_m(local_machine);
+       if (!strlower_m(local_machine)) {
+               TALLOC_FREE(tmp_local_machine);
+               return false;
+       }
        TALLOC_FREE(tmp_local_machine);
 
        already_perm = perm;
@@ -118,7 +121,10 @@ bool set_remote_machine_name(const char *remote_name, bool 
perm)
        /* alpha_strcpy includes the space for the terminating nul. */
        alpha_strcpy(remote_machine,tmp_remote_machine,
                        SAFE_NETBIOS_CHARS,len+1);
-       strlower_m(remote_machine);
+       if (!strlower_m(remote_machine)) {
+               TALLOC_FREE(tmp_remote_machine);
+               return false;
+       }
        TALLOC_FREE(tmp_remote_machine);
 
        already_perm = perm;
@@ -153,7 +159,10 @@ void sub_set_smb_name(const char *name)
                return;
        }
        trim_char(tmp, ' ', ' ');
-       strlower_m(tmp);
+       if (!strlower_m(tmp)) {
+               TALLOC_FREE(tmp);
+               return;
+       }
 
        len = strlen(tmp);
 
diff --git a/source3/lib/username.c b/source3/lib/username.c
index 5192004..665fbb4 100644
--- a/source3/lib/username.c
+++ b/source3/lib/username.c
@@ -112,7 +112,11 @@ static struct passwd *Get_Pwnam_internals(TALLOC_CTX 
*mem_ctx,
 
        /* Try in all lower case first as this is the most 
           common case on UNIX systems */
-       strlower_m(user2);
+       if (!strlower_m(user2)) {
+               DEBUG(5,("strlower_m %s failed\n", user2));
+               goto done;
+       }
+
        DEBUG(5,("Trying _Get_Pwnam(), username as lowercase is %s\n",user2));
        ret = getpwnam_alloc_cached(mem_ctx, user2);
        if(ret)
@@ -128,7 +132,10 @@ static struct passwd *Get_Pwnam_internals(TALLOC_CTX 
*mem_ctx,
        }
 
        /* Try as uppercase, if username wasn't originally uppercase */
-       strupper_m(user2);
+       if (!strupper_m(user2)) {
+               goto done;
+       }
+
        if(strcmp(user, user2) != 0) {
                DEBUG(5,("Trying _Get_Pwnam(), username as uppercase is %s\n",
                         user2));
@@ -138,7 +145,10 @@ static struct passwd *Get_Pwnam_internals(TALLOC_CTX 
*mem_ctx,
        }
 
        /* Try all combinations up to usernamelevel */
-       strlower_m(user2);
+       if (!strlower_m(user2)) {
+               DEBUG(5,("strlower_m %s failed\n", user2));
+               goto done;
+       }
        DEBUG(5,("Checking combinations of %d uppercase letters in %s\n",
                 lp_usernamelevel(), user2));
        ret = uname_string_combinations(user2, mem_ctx, getpwnam_alloc_cached,
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 9c380c5..b8513f6 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -1892,8 +1892,14 @@ bool unix_wild_match(const char *pattern, const char 
*string)
                TALLOC_FREE(ctx);
                return false;
        }
-       strlower_m(p2);
-       strlower_m(s2);
+       if (!strlower_m(p2)) {
+               TALLOC_FREE(ctx);
+               return false;
+       }
+       if (!strlower_m(s2)) {
+               TALLOC_FREE(ctx);
+               return false;
+       }
 
        /* Remove any *? and ** from the pattern as they are meaningless */
        for(p = p2; *p; p++) {
diff --git a/source3/lib/util_names.c b/source3/lib/util_names.c
index 0e128ea..cf54a0e 100644
--- a/source3/lib/util_names.c
+++ b/source3/lib/util_names.c
@@ -63,8 +63,7 @@ static bool set_my_netbios_names(const char *name, int i)
        smb_my_netbios_names[i] = SMB_STRDUP(name);
        if (!smb_my_netbios_names[i])
                return False;
-       strupper_m(smb_my_netbios_names[i]);
-       return True;
+       return strupper_m(smb_my_netbios_names[i]);
 }
 
 /***********************************************************************
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index bfa6652..aa77d75 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -55,12 +55,12 @@ bool strnequal(const char *s1,const char *s2,size_t n)
  Convert a string to "normal" form.
 **/
 
-void strnorm(char *s, int case_default)
+bool strnorm(char *s, int case_default)
 {
        if (case_default == CASE_UPPER)
-               strupper_m(s);
+               return strupper_m(s);
        else
-               strlower_m(s);
+               return strlower_m(s);
 }
 
 /**
@@ -414,11 +414,11 @@ static bool unix_strlower(const char *src, size_t srclen, 
char *dest, size_t des
        if (!convert_string_talloc(talloc_tos(), CH_UNIX, CH_UTF16LE, src, 
srclen,
                                   (void **)(void *)&buffer, &size))
        {
-               smb_panic("failed to create UCS2 buffer");
+               return false;
        }
        if (!strlower_w(buffer) && (dest == src)) {
                TALLOC_FREE(buffer);
-               return srclen;
+               return true;
        }
        ret = convert_string(CH_UTF16LE, CH_UNIX, buffer, size, dest, destlen, 
&size);
        TALLOC_FREE(buffer);
@@ -460,10 +460,11 @@ _PUBLIC_ void strlower_m(char *s)
  Convert a string to lower case.
 **/
 
-void strlower_m(char *s)
+bool strlower_m(char *s)
 {
        size_t len;
        int errno_save;
+       bool ret = false;
 
        /* this is quite a common operation, so we want it to be
           fast. We optimise for the ascii case, knowing that all our
@@ -476,18 +477,20 @@ void strlower_m(char *s)
        }
 
        if (!*s)
-               return;
+               return true;
 
        /* I assume that lowercased string takes the same number of bytes
         * as source string even in UTF-8 encoding. (VIV) */
        len = strlen(s) + 1;
        errno_save = errno;
        errno = 0;
-       unix_strlower(s,len,s,len);
+       ret = unix_strlower(s,len,s,len);
        /* Catch mb conversion errors that may not terminate. */
-       if (errno)
+       if (errno) {
                s[len-1] = '\0';
+       }
        errno = errno_save;
+       return ret;
 }
 
 static bool unix_strupper(const char *src, size_t srclen, char *dest, size_t 
destlen)
@@ -497,12 +500,12 @@ static bool unix_strupper(const char *src, size_t srclen, 
char *dest, size_t des
        bool ret;
 
        if (!push_ucs2_talloc(talloc_tos(), &buffer, src, &size)) {
-               return (size_t)-1;
+               return false;
        }
 
        if (!strupper_w(buffer) && (dest == src)) {
                TALLOC_FREE(buffer);
-               return srclen;
+               return true;
        }
 
        ret = convert_string(CH_UTF16LE, CH_UNIX, buffer, size, dest, destlen, 
&size);
@@ -545,10 +548,11 @@ _PUBLIC_ void strupper_m(char *s)
  Convert a string to upper case.
 **/
 
-void strupper_m(char *s)
+bool strupper_m(char *s)
 {
        size_t len;
        int errno_save;
+       bool ret = false;
 
        /* this is quite a common operation, so we want it to be
           fast. We optimise for the ascii case, knowing that all our
@@ -561,18 +565,20 @@ void strupper_m(char *s)
        }
 
        if (!*s)
-               return;
+               return true;
 
        /* I assume that lowercased string takes the same number of bytes
         * as source string even in multibyte encoding. (VIV) */
        len = strlen(s) + 1;
        errno_save = errno;
        errno = 0;
-       unix_strupper(s,len,s,len);
+       ret = unix_strupper(s,len,s,len);
        /* Catch mb conversion errors that may not terminate. */
-       if (errno)
+       if (errno) {
                s[len-1] = '\0';
+       }
        errno = errno_save;
+       return ret;
 }
 
 /**
@@ -983,7 +989,11 @@ int asprintf_strupper_m(char **strp, const char *fmt, ...)
        if (ret == -1)
                return -1;
 
-       strupper_m(result);
+       if (!strupper_m(result)) {
+               SAFE_FREE(result);
+               return -1;
+       }
+
        *strp = result;
        return ret;
 }
@@ -1000,7 +1010,10 @@ char *talloc_asprintf_strupper_m(TALLOC_CTX *t, const 
char *fmt, ...)
        if (ret == NULL) {
                return NULL;
        }
-       strupper_m(ret);
+       if (!strupper_m(ret)) {
+               TALLOC_FREE(ret);
+               return NULL;
+       }
        return ret;
 }
 
@@ -1016,7 +1029,10 @@ char *talloc_asprintf_strlower_m(TALLOC_CTX *t, const 
char *fmt, ...)
        if (ret == NULL) {
                return NULL;
        }
-       strlower_m(ret);
+       if (!strlower_m(ret)) {
+               TALLOC_FREE(ret);
+               return NULL;
+       }
        return ret;
 }
 
diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c
index 285057b..45d00a3 100644
--- a/source3/libads/ads_struct.c
+++ b/source3/libads/ads_struct.c
@@ -108,7 +108,11 @@ char *ads_build_domain(const char *dn)
                return NULL;            
        }       
 
-       strlower_m( dnsdomain );        
+       if (!strlower_m( dnsdomain )) {
+               SAFE_FREE(dnsdomain);
+               return NULL;
+       }
+


-- 
Samba Shared Repository

Reply via email to