summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/charcnv.c2
-rw-r--r--source3/libsmb/climessage.c17
-rw-r--r--source3/smbd/message.c27
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);