diff --git a/ChangeLog b/ChangeLog
index 8d1b4ee7335061b94e686e99e290a4f83c376442..4cd8694f0e284e9b26e90e0bcff381c64255fa87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -58,6 +58,9 @@ Changes in version 0.2.0.13-alpha - 2007-12-??
       using bridges or we have StrictEntryNodes set), don't mark relays
       down when they fail a directory request. Otherwise we're too quick
       to mark all our entry points down.
+    - Fix handling of hex nicknames when answering controller requests for
+      networkstatus by name, or when deciding whether to warn about unknown
+      routers in a config option. Bugfix on 0.2.0.x. (Patch from mwenge.)
 
   o Minor features:
     - On USR1, when dmalloc is in use, log the top 10 memory
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 6a72340bab1f7f9a9f60fd5617c06be17841563c..dadfbc54d47403e491765788c7770ee5886f87fb 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -830,11 +830,11 @@ router_get_consensus_status_by_nickname(const char *nickname,
     return NULL;
 
   if (nickname[0] == '$') {
-    if (base16_decode(digest, DIGEST_LEN, nickname+1, strlen(nickname))<0)
+    if (base16_decode(digest, DIGEST_LEN, nickname+1, strlen(nickname+1))<0)
       return NULL;
     return networkstatus_vote_find_entry(current_consensus, digest);
   } else if (strlen(nickname) == HEX_DIGEST_LEN &&
-       (base16_decode(digest, DIGEST_LEN, nickname+1, strlen(nickname))==0)) {
+       (base16_decode(digest, DIGEST_LEN, nickname, strlen(nickname))==0)) {
     return networkstatus_vote_find_entry(current_consensus, digest);
   }