@@ -1169,28 +1169,54 @@
1169 1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1170 1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1171 1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1172 1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1173 1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Shell-escape the given string. Append the result to a blob.
1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void shell_escape(Blob *pBlob, const char *zIn){
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = blob_size(pBlob);
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int k = strlen(zIn);
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i, c;
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *z;
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; (c = zIn[i])!=0; i++){
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fossil_isspace(c) || c=='"' || (c=='\\' && zIn[i+1]!=0) ){
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(pBlob, "\"%s\"", zIn);
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- z = blob_buffer(pBlob);
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=n+1; i<=n+k; i++){
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( z[i]=='"' ) z[i] = '_';
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return;
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pBlob, zIn, -1);
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pBlob is a shell command under construction. This routine safely
1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** appends argument zIn.
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The argument is escaped if it contains white space or other characters
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that need to be escaped for the shell. If zIn contains characters
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that cannot be safely escaped, then throw a fatal error.
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The argument is expected to a filename of some kinds. As shell commands
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** commonly have command-line options that begin with "-" and since we
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** do not want an attacker to be able to invoke these switches using
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** filenames that begin with "-", if zIn begins with "-", prepend
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an additional "./".
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void blob_append_escaped_arg(Blob *pBlob, const char *zIn){
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int needEscape = 0;
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = blob_size(pBlob);
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z = blob_buffer(pBlob);
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char cQuote = '"'; /* Use "..." quoting on windows */
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char cQuote = '\''; /* Use '...' quoting on unix */
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; (c = zIn[i])!=0; i++){
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c==cQuote || c=='\\' || c<' ' || c==';' || c=='*' || c=='?' || c=='[') {
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob bad;
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_token(pBlob, &bad);
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("the [%s] argument to the \"%s\" command contains "
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "a character (ascii 0x%02x) that is a security risk",
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zIn, blob_str(&bad), c);
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !needEscape && !fossil_isalnum(c) && c!='/' && c!='.' && c!='_' ){
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ needEscape = 1;
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n>0 && !fossil_isspace(z[n-1]) ){
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pBlob, " ", 1);
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( needEscape ) blob_append(pBlob, &cQuote, 1);
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zIn[0]=='-' ) blob_append(pBlob, "./", 2);
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pBlob, zIn, -1);
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( needEscape ) blob_append(pBlob, &cQuote, 1);
1192 1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1193 1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1194 1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1195 1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A read(2)-like impl for the Blob class. Reads (copies) up to nLen
1196 1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** bytes from pIn, starting at position pIn->iCursor, and copies them
1197 1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!