080a160c7b9595d516c9c70e83689a09b60839d0
galt
Mon Jun 3 12:16:53 2013 -0700
fix SQL Injection
diff --git src/hg/hgTables/identifiers.c src/hg/hgTables/identifiers.c
index cbfcda3..e8e6eb7 100644
--- src/hg/hgTables/identifiers.c
+++ src/hg/hgTables/identifiers.c
@@ -127,38 +127,38 @@
hPrintf("%s
\n", tmp);
freeMem(tmp);
}
if (aliasField != NULL)
{
char tmpTable[512];
char query[2048];
// do not use any db. prefix on curTable for name
char *plainCurTable = strrchr(curTable, '.');
if (plainCurTable)
plainCurTable++;
else
plainCurTable = curTable;
safef(tmpTable, sizeof(tmpTable), "hgTemp.tmp%s%s", plainCurTable, xrefTable);
if (differentString(xrefTable, curTable))
- safef(query, sizeof(query),
+ sqlSafef(query, sizeof(query),
"create temporary table %s select %s.%s as %s from %s,%s "
"where %s.%s = %s.%s and %s.%s != %s.%s limit 100000",
tmpTable, xrefTable, aliasField, aliasField, xrefTable, curTable,
xrefTable, xrefIdField, curTable, idField,
xrefTable, xrefIdField, xrefTable, aliasField);
else
- safef(query, sizeof(query),
+ sqlSafef(query, sizeof(query),
"create temporary table %s select %s from %s "
"where %s != %s limit 100000",
tmpTable, aliasField, xrefTable, aliasField, xrefIdField);
sqlUpdate(conn, query);
exampleList = getExamples(db, conn, tmpTable, aliasField, 3);
for (ex = exampleList; ex != NULL; ex = ex->next)
hPrintf("%s
\n", ex->name);
}
hPrintf("\n");
}
}
void doPasteIdentifiers(struct sqlConnection *conn)
/* Respond to paste identifiers button. */
{
@@ -229,71 +229,71 @@
}
static void addPrimaryIdsToHash(struct sqlConnection *conn, struct hash *hash,
char *idField, struct slName *tableList,
struct lm *lm, char *extraWhere)
/* For each table in tableList, query all idField values and add to hash,
* id -> uppercased id for case-insensitive matching. */
{
struct slName *table;
struct sqlResult *sr;
char **row;
struct dyString *query = dyStringNew(0);
for (table = tableList; table != NULL; table = table->next)
{
dyStringClear(query);
- dyStringPrintf(query, "select %s from %s", idField, table->name);
+ sqlDyStringPrintf(query, "select %s from %s", idField, table->name);
if (extraWhere != NULL)
dyStringPrintf(query, " where %s", extraWhere);
sr = sqlGetResult(conn, query->string);
while ((row = sqlNextRow(sr)) != NULL)
{
if (isNotEmpty(row[0]))
{
char *origCase = lmCloneString(lm, row[0]);
touppers(row[0]);
hashAdd(hash, row[0], origCase);
}
}
sqlFreeResult(&sr);
}
}
static void addXrefIdsToHash(struct sqlConnection *conn, struct hash *hash,
char *idField, char *xrefTable, char *xrefIdField,
char *aliasField, struct lm *lm, char *extraWhere)
/* Query all id-alias pairs from xrefTable (where id actually appears
* in curTable) and hash alias -> id. Convert alias to upper case for
* case-insensitive matching.
* Ignore self (alias = id) mappings -- we already got those above. */
{
struct sqlResult *sr;
char **row;
struct dyString *query = dyStringNew(0);
if (sameString(xrefTable, curTable))
- dyStringPrintf(query, "select %s,%s from %s", aliasField, xrefIdField, xrefTable);
+ sqlDyStringPrintf(query, "select %s,%s from %s", aliasField, xrefIdField, xrefTable);
else
/* Get only the aliases for items actually in curTable.idField: */
- dyStringPrintf(query,
+ sqlDyStringPrintf(query,
"select %s.%s,%s.%s from %s,%s where %s.%s = %s.%s",
xrefTable, aliasField, xrefTable, xrefIdField,
xrefTable, curTable,
xrefTable, xrefIdField, curTable, idField);
if (extraWhere != NULL)
// extraWhere begins w/ID field of curTable=xrefTable. Skip that field name and
// use "xrefTable.aliasField" with the IN (...) condition that follows:
- dyStringPrintf(query, " %s %s.%s %s",
+ sqlDyStringPrintf(query, " %s %s.%s %-s",
(sameString(xrefTable, curTable) ? "where" : "and"),
xrefTable, aliasField, skipToSpaces(extraWhere));
sr = sqlGetResult(conn, query->string);
while ((row = sqlNextRow(sr)) != NULL)
{
if (sameString(row[0], row[1]))
continue;
touppers(row[0]);
hashAdd(hash, row[0], lmCloneString(lm, row[1]));
}
sqlFreeResult(&sr);
}
static struct hash *getAllPossibleIds(struct sqlConnection *conn,
struct lm *lm, char *idField, char *extraWhere)
@@ -325,40 +325,40 @@
if (xrefTable != NULL)
{
addXrefIdsToHash(alternateConn, matchHash, idField,
xrefTable, xrefIdField, aliasField, lm, extraWhere);
}
if (sameWord(curTable, WIKI_TRACK_TABLE))
wikiDisconnect(&alternateConn);
return matchHash;
}
static char *slNameToInExpression(char *field, struct slName *allTerms)
/* Given an slName list, return a SQL "field IN ('term1', 'term2', ...)" expression
* to be used in a WHERE clause. */
{
struct dyString *dy = dyStringNew(0);
-dyStringPrintf(dy, "%s in (", field);
+sqlDyStringPrintfFrag(dy, "%s in (", field);
boolean first = TRUE;
struct slName *term;
for (term = allTerms; term != NULL; term = term->next)
{
if (first)
first = FALSE;
else
dyStringAppend(dy, ", ");
- dyStringPrintf(dy, "'%s'", term->name);
+ sqlDyStringPrintf(dy, "'%s'", term->name);
}
dyStringAppend(dy, ")");
return dyStringCannibalize(&dy);
}
#define MAX_IDTEXT (64 * 1024)
#define DEFAULT_MAX_IDS_IN_WHERE 10000
void doPastedIdentifiers(struct sqlConnection *conn)
/* Process submit in paste identifiers page. */
{
char *idText = trimSpaces(cartString(cart, hgtaPastedIdentifiers));
htmlOpen("Table Browser (Input Identifiers)");
if (isNotEmpty(idText))