diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 16fc3a3f11b..7a187507c46 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -1783,24 +1783,21 @@ bad:
 }
 
 /* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE and
-   FUNC_INFO to the encoder context ECTX.  */
+   FUNC_INFO to the encoder context ECTX.  Caller must make sure that ECTX
+   exists.  */
 
-int
-sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx,
-			     int32_t start_addr,
-			     uint32_t func_size,
-			     unsigned char func_info,
-			     uint32_t num_fres ATTRIBUTE_UNUSED)
+static int
+sframe_encoder_add_funcdesc_internal (sframe_encoder_ctx *ectx,
+				      int32_t start_addr,
+				      uint32_t func_size,
+				      unsigned char func_info,
+				      uint32_t num_fres ATTRIBUTE_UNUSED)
 {
   sframe_header *ehp;
   sf_fde_tbl *fd_info;
   size_t fd_tbl_sz;
   int err = 0;
 
-  /* FIXME book-keep num_fres for error checking.  */
-  if (ectx == NULL)
-    return sframe_set_errno (&err, SFRAME_ERR_INVAL);
-
   fd_info = ectx->sfe_funcdesc;
   ehp = sframe_encoder_get_header (ectx);
 
@@ -1857,7 +1854,24 @@ bad:
     free (fd_info);
   ectx->sfe_funcdesc = NULL;
   ehp->sfh_num_fdes = 0;
-  return -1;
+  return err;
+}
+
+/* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE and
+   FUNC_INFO to the encoder context ECTX.  */
+
+int
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx,
+			     int32_t start_addr,
+			     uint32_t func_size,
+			     unsigned char func_info,
+			     uint32_t num_fres)
+{
+  if (ectx == NULL)
+    return SFRAME_ERR_INVAL;
+
+  return sframe_encoder_add_funcdesc_internal (ectx, start_addr, func_size,
+					       func_info, num_fres);
 }
 
 /* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE,
@@ -1878,10 +1892,10 @@ sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *ectx,
   if (ectx == NULL || sframe_encoder_get_version (ectx) == SFRAME_VERSION_1)
     return sframe_set_errno (&err, SFRAME_ERR_INVAL);
 
-  err = sframe_encoder_add_funcdesc (ectx, start_addr, func_size, func_info,
-				     num_fres);
+  err = sframe_encoder_add_funcdesc_internal (ectx, start_addr, func_size,
+					      func_info, num_fres);
   if (err)
-    return SFRAME_ERR;
+    return err;
 
   fd_info = ectx->sfe_funcdesc;
   fd_info->entry[fd_info->count-1].func_rep_size = rep_block_size;
