diff --git a/src/internal/XMLScanner.cpp b/src/internal/XMLScanner.cpp
index aada8e2e59c34e5002e4bbd59d46bbccfa0a9985..fe5f208f86b07e7f69827afd867539b2ca6f250b 100644
--- a/src/internal/XMLScanner.cpp
+++ b/src/internal/XMLScanner.cpp
@@ -3450,24 +3450,32 @@ void XMLScanner::scanXMLDecl(const DeclTypes type)
 
 const XMLCh* XMLScanner::getURIText(const   unsigned int    uriId) const
 {
-    // Look up the URI in the string pool and return its id
-    const XMLCh* value = fURIStringPool->getValueForId(uriId);
-    if (!value)
-        return XMLUni::fgZeroLenString;
+    if (fURIStringPool->exists(uriId)) {
+        // Look up the URI in the string pool and return its id
+        const XMLCh* value = fURIStringPool->getValueForId(uriId);
+        if (!value)
+            return XMLUni::fgZeroLenString;
 
-	return value;
+        return value;
+    }
+    else
+        return XMLUni::fgZeroLenString;
 }
 
 bool XMLScanner::getURIText(  const   unsigned int    uriId
                       ,       XMLBuffer&      uriBufToFill) const
 {
-    // Look up the URI in the string pool and return its id
-    const XMLCh* value = fURIStringPool->getValueForId(uriId);
-    if (!value)
-        return false;
+    if (fURIStringPool->exists(uriId)) {
+        // Look up the URI in the string pool and return its id
+        const XMLCh* value = fURIStringPool->getValueForId(uriId);
+        if (!value)
+            return false;
 
-    uriBufToFill.set(value);
-    return true;
+        uriBufToFill.set(value);
+        return true;
+    }
+    else
+        return false;
 }
 
 unsigned int
diff --git a/src/util/StringPool.cpp b/src/util/StringPool.cpp
index e99a769a500abc30f8782192768283b181ebe4bb..9c5ddb3e6129ed9ca05e821a46dff480e1f3c863 100644
--- a/src/util/StringPool.cpp
+++ b/src/util/StringPool.cpp
@@ -1,37 +1,37 @@
 /*
  * The Apache Software License, Version 1.1
- * 
- * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  * reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- * 
+ *    notice, this list of conditions and the following disclaimer.
+ *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
- * 
+ *
  * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
+ *    if any, must include the following acknowledgment:
  *       "This product includes software developed by the
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowledgment may appear in the software itself,
  *    if and wherever such third-party acknowledgments normally appear.
- * 
+ *
  * 4. The names "Xerces" and "Apache Software Foundation" must
  *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
+ *    software without prior written permission. For written
  *    permission, please contact apache\@apache.org.
- * 
+ *
  * 5. Products derived from this software may not be called "Apache",
  *    nor may "Apache" appear in their name, without prior written
  *    permission of the Apache Software Foundation.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -45,7 +45,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
- * 
+ *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Apache Software Foundation, and was
  * originally based on software copyright (c) 1999, International
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2001/10/22 15:43:35  tng
+ * [Bug 3361] "String pool id was not legal" error in Attributes::getURI().
+ *
  * Revision 1.5  2000/07/07 22:16:51  jpolast
  * remove old put(value) function.  use put(key,value) instead.
  *
@@ -162,6 +165,14 @@ bool XMLStringPool::exists(const XMLCh* const newString) const
     return fHashTable->containsKey(newString);
 }
 
+bool XMLStringPool::exists(const unsigned int id) const
+{
+    if (!id || (id >= fCurId))
+        return false;
+
+    return true;
+}
+
 void XMLStringPool::flushAll()
 {
     fCurId = 1;
@@ -176,7 +187,7 @@ unsigned int XMLStringPool::getId(const XMLCh* const toFind) const
         return elemToFind->fId;
 
     // Not found, so return zero, which is never a legal id
-    return 0;    
+    return 0;
 }
 
 
diff --git a/src/util/StringPool.hpp b/src/util/StringPool.hpp
index eaca860205527a280c9af501dcabd4e51094dfef..783d5ba6c7c41272193cb8c3403e4305baabbfa9 100644
--- a/src/util/StringPool.hpp
+++ b/src/util/StringPool.hpp
@@ -1,37 +1,37 @@
 /*
  * The Apache Software License, Version 1.1
- * 
- * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  * reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- * 
+ *    notice, this list of conditions and the following disclaimer.
+ *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
- * 
+ *
  * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
+ *    if any, must include the following acknowledgment:
  *       "This product includes software developed by the
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowledgment may appear in the software itself,
  *    if and wherever such third-party acknowledgments normally appear.
- * 
+ *
  * 4. The names "Xerces" and "Apache Software Foundation" must
  *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
+ *    software without prior written permission. For written
  *    permission, please contact apache\@apache.org.
- * 
+ *
  * 5. Products derived from this software may not be called "Apache",
  *    nor may "Apache" appear in their name, without prior written
  *    permission of the Apache Software Foundation.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -45,7 +45,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
- * 
+ *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Apache Software Foundation, and was
  * originally based on software copyright (c) 1999, International
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2001/10/22 15:43:35  tng
+ * [Bug 3361] "String pool id was not legal" error in Attributes::getURI().
+ *
  * Revision 1.4  2000/07/07 22:16:52  jpolast
  * remove old put(value) function.  use put(key,value) instead.
  *
@@ -109,6 +112,7 @@ public :
     // -----------------------------------------------------------------------
     unsigned int addOrFind(const XMLCh* const newString);
     bool exists(const XMLCh* const newString) const;
+    bool exists(const unsigned int id) const;
     void flushAll();
     unsigned int getId(const XMLCh* const toFind) const;
     const XMLCh* getValueForId(const unsigned int id) const;