Skip to content

wmbiff - handle incorrect replies from office365.com IMAP server #50

@tnais

Description

@tnais

This nice IMAP server authors could have violated (did not check correctly) the RFC that should state that multiple blanks in a reply are not allowed.

No matter if putting multiple blanks in an imap reply is or is not legal, I prefer to patch my code to have wmbiff working. My solution was to replace strncpy with a replacement that copies a single blank each time multiple blanks are found.

Having issues committing the single changed file (dockapps/wmbiff/wmbiff/tlsComm.c I add my patch here.

---------------------------------------8<----------------------------------------------------------------------
From 1697c7f78874e66ac25f4249805f111fecc9ba18 Mon Sep 17 00:00:00 2001
Message-Id: 1697c7f78874e66ac25f4249805f111fecc9ba18.1679925131.git.saint@eng.it
In-Reply-To: f2bf4066c333a526d2f87733edb342acde7e466d.1679925131.git.saint@eng.it
References: f2bf4066c333a526d2f87733edb342acde7e466d.1679925131.git.saint@eng.it
From: Gian Uberto Lauri saint@eng.it
Date: Mon, 27 Mar 2023 15:40:56 +0200
Subject: [PATCH 2/2] #feature/handle_multiple_blanks - Handles wrong
(multiple blanks) answer from Office365 IMAP server

Changes to be committed:
modified: wmbiff/wmbiff/tlsComm.c

wmbiff/wmbiff/tlsComm.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/wmbiff/wmbiff/tlsComm.c b/wmbiff/wmbiff/tlsComm.c
index 03b8009..fb4731a 100644
--- a/wmbiff/wmbiff/tlsComm.c
+++ b/wmbiff/wmbiff/tlsComm.c
@@ -159,6 +159,35 @@ static int wait_for_it(int sd, int timeoutseconds)
return (FD_ISSET(sd, &readfds));
}

+/* exported for testing /
+/
This version converts sequence of multiple blanks into a single

    • blank. This overcomes, say, the bug in the imap server of a random
    • company who thinks it can disregard standards because it is big and
    • hard. (pun intended) */
      +extern char *
      +strncpy_trim_blanks(char *dest, const char *src, size_t n)
      +{
  • size_t i;
  •   int last_read_was_not_a_blank = 1;
    
  •   char *m_src = src, *m_dest = dest;
    
  •   char ch;
    
  •   for (i = 0; i < n && src[i] != '\0'; i++) {
    
  •   		ch = *m_src++;
    
  •   		if (ch != ' ' || last_read_was_not_a_blank) {
    
  •   				*m_dest = ch;
    
  •   				m_dest++;
    
  •   		}
    
  •   		last_read_was_not_a_blank = ch != ' ';
    
  •   }
    
  • for ( ; i < n; i++)
  •    dest[i] = '\0';
    
  •   return dest;
    

+}
+
/* exported for testing */
extern int
getline_from_buffer(char *readbuffer, char *linebuffer, int linebuflen)
@@ -184,7 +213,7 @@ getline_from_buffer(char *readbuffer, char *linebuffer, int linebuflen)

if (i != 0) {
	/* copy a line into the linebuffer */
  •   strncpy(linebuffer, readbuffer, (size_t) i);
    
  •   strncpy_trim_blanks(linebuffer, readbuffer, (size_t) i);
      /* sigh, null terminate */
      linebuffer[i] = '\0';
      /* shift the rest over; this could be done
    

--
2.37.2

-------8<------------------------------------------------------------------------------------

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions