diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/charcnv.c | 2 | ||||
-rw-r--r-- | source3/libsmb/climessage.c | 17 | ||||
-rw-r--r-- | source3/smbd/message.c | 27 |
3 files changed, 33 insertions, 13 deletions
diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index fa646573d8..42cba33483 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -186,7 +186,7 @@ size_t convert_string(charset_t from, charset_t to, * @returns Size in bytes of the converted string; or -1 in case of error. **/ -static size_t convert_string_allocate(charset_t from, charset_t to, +size_t convert_string_allocate(charset_t from, charset_t to, void const *src, size_t srclen, void **dest) { size_t i_len, o_len, destlen; diff --git a/source3/libsmb/climessage.c b/source3/libsmb/climessage.c index 1587e6f4cd..5f6ce36133 100644 --- a/source3/libsmb/climessage.c +++ b/source3/libsmb/climessage.c @@ -65,6 +65,8 @@ send a message ****************************************************************************/ BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp) { + char *msgdos; + int lendos; char *p; memset(cli->outbuf,'\0',smb_size); @@ -77,9 +79,18 @@ BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp) p = smb_buf(cli->outbuf); *p++ = 1; - SSVAL(p,0,len); p += 2; - memcpy(p,msg,len); - p += len; + + if ((lendos = convert_string_allocate(CH_UNIX, CH_DOS, msg,len, (void **) &msgdos)) < 0 || !msgdos) { + DEBUG(3,("Conversion failed, sending message in UNIX charset\n")); + SSVAL(p, 0, len); p += 2; + memcpy(p, msg, len); + p += len; + } else { + SSVAL(p, 0, lendos); p += 2; + memcpy(p, msgdos, lendos); + p += lendos; + SAFE_FREE(msgdos); + } cli_setup_bcc(cli, p); cli_send_smb(cli); diff --git a/source3/smbd/message.c b/source3/smbd/message.c index ba646f12aa..233848d2d6 100644 --- a/source3/smbd/message.c +++ b/source3/smbd/message.c @@ -41,6 +41,8 @@ static void msg_deliver(void) pstring name; int i; int fd; + char *msg; + int len; if (! (*lp_msg_command())) { @@ -61,16 +63,23 @@ static void msg_deliver(void) /* * Incoming message is in DOS codepage format. Convert to UNIX. */ - - if(msgpos > 0) { - msgbuf[msgpos] = '\0'; /* Ensure null terminated. */ - } - - for (i=0;i<msgpos;) { - if (msgbuf[i]=='\r' && i<(msgpos-1) && msgbuf[i+1]=='\n') { - i++; continue; + + if ((len = convert_string_allocate(CH_DOS, CH_UNIX, msgbuf, msgpos, (void **) &msg)) < 0 || !msg) { + DEBUG(3,("Conversion failed, delivering message in DOS codepage format\n")); + for (i = 0; i < msgpos;) { + if (msgbuf[i] == '\r' && i < (msgpos-1) && msgbuf[i+1] == '\n') { + i++; continue; + } + write(fd, &msgbuf[i++], 1); + } + } else { + for (i = 0; i < len;) { + if (msg[i] == '\r' && i < (len-1) && msg[i+1] == '\n') { + i++; continue; + } + write(fd, &msg[i++],1); } - write(fd,&msgbuf[i++],1); + SAFE_FREE(msg); } close(fd); |