@@ -103,29 +103,48 @@ static char *mag_escape_display_value(request_rec *req,
103103 /* This function returns a copy (in the pool) of the given gss_buffer_t
104104 * where every occurrence of " has been replaced by \". This string is
105105 * NULL terminated */
106- int i = 0 ;
106+ int i = 0 , j = 0 ;
107107 char * escaped_value = NULL , * p = NULL ;
108108 char * value = (char * ) disp_value .value ;
109109
110110 /* gss_buffer_t are not \0 terminated, but our result will be. Hence,
111- * escaped length will be original length * 2 + 1 in the worst case */
112- p = escaped_value = apr_palloc (req -> pool , disp_value .length * 2 + 1 );
113- for (i = 0 ; i < disp_value .length ; i ++ ) {
114- switch (value [i ]){
115- case '"' : memcpy (p , "\\\"" , 2 ); p += 2 ; break ;
116- case '/' : memcpy (p , "\\/" , 2 ); p += 2 ; break ;
117- case '\\' : memcpy (p , "\\\\" , 2 ); p += 2 ; break ;
118- case '\b' : memcpy (p , "\\b" , 2 ); p += 2 ; break ;
119- case '\t' : memcpy (p , "\\t" , 2 ); p += 2 ; break ;
120- case '\r' : memcpy (p , "\\r" , 2 ); p += 2 ; break ;
121- case '\f' : memcpy (p , "\\f" , 2 ); p += 2 ; break ;
122- case '\n' : memcpy (p , "\\n" , 2 ); p += 2 ; break ;
123- default : * p = value [i ]; p += 1 ; break ;
111+ * escaped length will be original length * 6 + 1 in the worst case */
112+ p = escaped_value = apr_palloc (req -> pool , disp_value .length * 6 + 1 );
113+ for (i = 0 , j = 0 ; i < disp_value .length ; i ++ , j ++ ) {
114+ if ((value [i ] < 0x1F ) || (value [i ] == '"' ) || (value [i ] == '\\' )) {
115+ escaped_value [j ] = '\\' ;
116+ j ++ ;
117+ switch (value [i ]) {
118+ case '"' :
119+ case '\\' :
120+ escaped_value [j ] = value [i ];
121+ break ;
122+ case '\b' :
123+ escaped_value [j ] = 'b' ;
124+ break ;
125+ case '\t' :
126+ escaped_value [j ] = 't' ;
127+ break ;
128+ case '\r' :
129+ escaped_value [j ] = 'r' ;
130+ break ;
131+ case '\f' :
132+ escaped_value [j ] = 'f' ;
133+ break ;
134+ case '\n' :
135+ escaped_value [j ] = 'n' ;
136+ break ;
137+ default :
138+ apr_snprintf (& escaped_value [j ], 6 , "u%04d" , (int ) value [i ]);
139+ j += 4 ;
140+ }
141+ } else {
142+ escaped_value [j ] = value [i ];
124143 }
125144 }
126145
127146 /* Make the string NULL terminated */
128- * p = 0 ;
147+ escaped_value [ j ] = '\0' ;
129148 return escaped_value ;
130149}
131150
0 commit comments